OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配
概述 之前的文章SURF和SIFT算子实现特征点检测简单地讲了利用SIFT和SURF算子检测特征点,在检测的基础上可以使用SIFT和SURF算子对特征点进行特征提取并使用匹配函数进行特征点的匹配。具体实现是首先采用SurfFeatureDetector检测特征点,再使用SurfDescripto
概述
之前的文章SURF和SIFT算子实现特征点检测简单地讲了利用SIFT和SURF算子检测特征点,在检测的基础上可以使用SIFT和SURF算子对特征点进行特征提取并使用匹配函数进行特征点的匹配。具体实现是首先采用SurfFeatureDetector检测特征点,再使用SurfDescriptorExtractor计算特征点的特征向量,最后采用BruteForceMatcher暴力匹配法或者FlannBasedMatcher选择性匹配法(二者的不同)来进行特征点匹配。
实验所用环境是opencv2.4.0+vs2008+win7,需要注意opencv2.4.X版本中SurfFeatureDetector是包含在opencv2/nonfree/features2d.hpp中,BruteForceMatcher是包含在opencv2/legacy/legacy.hpp中,FlannBasedMatcher是包含在opencv2/features2d/features2d.hpp中。
BruteForce匹配法
首先使用BruteForceMatcher暴力匹配法,代码如下:
/** * @采用SURF算子检测特征点,对特征点进行特征提取,并使用BruteForce匹配法进行特征点的匹配 * @SurfFeatureDetector + SurfDescriptorExtractor + BruteForceMatcher * @author holybin */ #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/nonfree/features2d.hpp" //SurfFeatureDetector实际在该头文件中 #include "opencv2/legacy/legacy.hpp" //BruteForceMatcher实际在该头文件中 //#include "opencv2/features2d/features2d.hpp" //FlannBasedMatcher实际在该头文件中 #include "opencv2/highgui/highgui.hpp" using namespace cv; using namespace std; int main( int argc, char** argv ) { Mat src_1 = imread( "D:\\opencv_pic\\cat3d120.jpg", CV_LOAD_IMAGE_GRAYSCALE ); Mat src_2 = imread( "D:\\opencv_pic\\cat0.jpg", CV_LOAD_IMAGE_GRAYSCALE ); if( !src_1.data || !src_2.data ) { cout keypoints_1, keypoints_2; detector.detect( src_1, keypoints_1 ); detector.detect( src_2, keypoints_2 ); cout > matcher; vector matches; matcher.match( descriptors_1, descriptors_2, matches ); cout<br> <p>实验结果:</p> <img src="/static/imghw/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20141115151204375%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9seWJpbg%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fu012564690%2Farticle%2Fdetails%2F17370511" class="lazy" alt="OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配" ><br> <p><span><br> </span></p> <h1 id="span-FLANN匹配法-span"><span>FLANN匹配法</span></h1> <p>使用暴力匹配的结果不怎么好,下面使用FlannBasedMatcher进行特征匹配,只保留好的特征匹配点,代码如下:</p> <pre class="brush:php;toolbar:false">/** * @采用SURF算子检测特征点,对特征点进行特征提取,并使用FLANN匹配法进行特征点的匹配 * @SurfFeatureDetector + SurfDescriptorExtractor + FlannBasedMatcher * @author holybin */ #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/nonfree/features2d.hpp" //SurfFeatureDetector实际在该头文件中 //#include "opencv2/legacy/legacy.hpp" //BruteForceMatcher实际在该头文件中 #include "opencv2/features2d/features2d.hpp" //FlannBasedMatcher实际在该头文件中 #include "opencv2/highgui/highgui.hpp" using namespace cv; using namespace std; int main( int argc, char** argv ) { Mat src_1 = imread( "D:\\opencv_pic\\cat3d120.jpg", CV_LOAD_IMAGE_GRAYSCALE ); Mat src_2 = imread( "D:\\opencv_pic\\cat0.jpg", CV_LOAD_IMAGE_GRAYSCALE ); if( !src_1.data || !src_2.data ) { cout keypoints_1, keypoints_2; detector.detect( src_1, keypoints_1 ); detector.detect( src_2, keypoints_2 ); cout allMatches; matcher.match( descriptors_1, descriptors_2, allMatches ); cout maxDist ) maxDist = dist; } printf(" max dist : %f \n", maxDist ); printf(" min dist : %f \n", minDist ); //-- 过滤匹配点,保留好的匹配点(这里采用的标准:distance goodMatches; for( int i = 0; i (), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS //不显示未匹配的点 ); imshow("matching result", matchImg ); //-- 输出匹配点的对应关系 for( int i = 0; i <br> <p>实验结果:</p> <img src="/static/imghw/default1.png" data-src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20141115151359125%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9seWJpbg%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fu012564690%2Farticle%2Fdetails%2F17370511" class="lazy" alt="OpenCV中feature2D学习SIFT和SURF算子实现特征点提取与匹配" ><br> <p><br> </p> <p>从第二个实验结果可以看出,经过过滤之后特征点数目从49减少到33,匹配的准确度有所上升。当然也可以使用SIFT算子进行上述两种匹配实验,只需要将SurfFeatureDetector换成SiftFeatureDetector,将SurfDescriptorExtractor换成SiftDescriptorExtractor即可。</p> <p><br> </p> <h1 id="span-拓展-span"><span>拓展</span></h1> <p> 在FLANN匹配法的基础上,还可以进一步利用透视变换和空间映射找出已知物体(目标检测),具体来说就是利用findHomography函数利用匹配的关键点找出相应的变换,再利用perspectiveTransform函数映射点群。具体可以参考这篇文章:OpenCV中feature2D学习——SIFT和SURF算法实现目标检测。</p> <p><br> </p> </iostream></stdio.h>

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tidak perlu lagi pip? Datang dan pelajari cara menyahpasang pip dengan berkesan! Pengenalan: pip ialah salah satu alat pengurusan pakej Python, yang boleh memasang, menaik taraf dan menyahpasang pakej Python dengan mudah. Walau bagaimanapun, kadangkala kita mungkin perlu menyahpasang pip, mungkin kerana kita ingin menggunakan alat pengurusan pakej yang lain, atau kerana kita perlu mengosongkan sepenuhnya persekitaran Python. Artikel ini akan menerangkan cara menyahpasang pip dengan cekap dan memberikan contoh kod khusus. 1. Kaedah menyahpasang pip Berikut akan memperkenalkan dua kaedah biasa untuk menyahpasang pip.

Gunakan arahan pip untuk memasang tutorial OpenCV dengan mudah, yang memerlukan contoh kod khusus OpenCV (OpenSource Computer Vision Library) ialah perpustakaan penglihatan komputer sumber terbuka Ia mengandungi sejumlah besar algoritma dan fungsi penglihatan komputer, yang boleh membantu pemaju membina imej dan aplikasi berkaitan pemprosesan video. Sebelum menggunakan OpenCV, kita perlu memasangnya terlebih dahulu. Nasib baik, Python menyediakan pip alat yang berkuasa untuk mengurus perpustakaan pihak ketiga

OpenCV ialah perpustakaan sumber terbuka untuk penglihatan komputer dan pemprosesan imej, yang digunakan secara meluas dalam pembelajaran mesin, pengecaman imej, pemprosesan video dan bidang lain. Apabila membangun menggunakan OpenCV, untuk menyahpepijat dan menjalankan program dengan lebih baik, ramai pembangun memilih untuk menggunakan PyCharm, persekitaran pembangunan bersepadu Python yang berkuasa. Artikel ini akan memberikan pengguna PyCharm tutorial pemasangan untuk OpenCV, dengan contoh kod khusus. Langkah Pertama: Pasang Python Pertama, pastikan anda telah memasang Python

Untuk mengetahui lebih lanjut tentang jadual warna matplotlib, anda memerlukan contoh kod khusus 1. Pengenalan matplotlib ialah perpustakaan lukisan Python yang berkuasa Ia menyediakan set fungsi dan alatan lukisan yang kaya yang boleh digunakan untuk mencipta pelbagai jenis carta. Peta warna (peta warna) ialah konsep penting dalam matplotlib, yang menentukan skema warna carta. Kajian mendalam tentang jadual warna matplotlib akan membantu kami menguasai fungsi lukisan matplotlib dengan lebih baik dan menjadikan lukisan lebih mudah.

Pelajari Pygame dari awal: tutorial pemasangan dan konfigurasi lengkap, contoh kod khusus diperlukan Pengenalan: Pygame ialah perpustakaan pembangunan permainan sumber terbuka yang dibangunkan menggunakan bahasa pengaturcaraan Python Ia menyediakan pelbagai fungsi dan alatan, membolehkan pembangun mencipta pelbagai jenis dengan mudah permainan. Artikel ini akan membantu anda mempelajari Pygame dari awal, dan menyediakan tutorial pemasangan dan konfigurasi yang lengkap, serta contoh kod khusus untuk membolehkan anda bermula dengan cepat. Bahagian Pertama: Memasang Python dan Pygame Pertama, pastikan anda mempunyai

Semasa mengedit kandungan teks dalam Word, anda kadangkala perlu memasukkan simbol formula. Sesetengah lelaki tidak tahu cara memasukkan nombor akar dalam Word, jadi Xiaomian meminta saya untuk berkongsi dengan rakan saya tutorial tentang cara memasukkan nombor akar dalam Word. Semoga membantu kawan-kawan. Mula-mula, buka perisian Word pada komputer anda, kemudian buka fail yang ingin anda edit, dan gerakkan kursor ke lokasi yang anda perlukan untuk memasukkan tanda akar, rujuk contoh gambar di bawah. 2. Pilih [Sisipkan], dan kemudian pilih [Formula] dalam simbol. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah: 3. Kemudian pilih [Insert New Formula] di bawah. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah: 4. Pilih [Radical], dan kemudian pilih radikal yang sesuai. Seperti yang ditunjukkan dalam bulatan merah dalam gambar di bawah:

Pesona Pembelajaran Bahasa C: Membuka Potensi Pengaturcara Dengan perkembangan teknologi yang berterusan, pengaturcaraan komputer telah menjadi satu bidang yang telah menarik perhatian ramai. Di antara banyak bahasa pengaturcaraan, bahasa C sentiasa digemari oleh pengaturcara. Kesederhanaan, kecekapan dan aplikasinya yang luas menjadikan pembelajaran bahasa C sebagai langkah pertama untuk ramai orang memasuki bidang pengaturcaraan. Artikel ini akan membincangkan daya tarikan mempelajari bahasa C dan cara membuka kunci potensi pengaturcara dengan mempelajari bahasa C. Pertama sekali, daya tarikan mempelajari bahasa C terletak pada kesederhanaannya. Berbanding dengan bahasa pengaturcaraan lain, bahasa C

PyCharm ialah persekitaran pembangunan bersepadu (IDE) Python yang kuat dibangunkan oleh JetBrains Ia menyediakan pelbagai fungsi dan alatan untuk membantu pembangun Python menulis kod, program nyahpepijat dan mengurus projek. Menggunakan OpenCV, perpustakaan penglihatan komputer yang berkuasa, dalam PyCharm, anda boleh melakukan pemprosesan imej, pemprosesan video dan tugas lain dengan mudah. Artikel ini akan memperincikan langkah untuk memasang dan mengkonfigurasi OpenCV dalam PyCharm dan memberikan contoh kod khusus. 1.An
