void sift_detector_and_descriptors(IplImage* i_left,IplImage* i_right)
{
Mat mat_image_left=Mat(i_left,false)
Mat mat_image_right=Mat(i_right,false)
cv::SiftFeatureDetector *pDetector=new cv::SiftFeatureDetector
pDetector->detect(mat_image_left,left_key_point)
pDetector->detect(mat_image_right,right_key_point)
Mat left_image_descriptors,right_image_descriptors
cv::SiftDescriptorExtractor *descriptor_extractor=new cv::SiftDescriptorExtractor
descriptor_extractor->compute(mat_image_left,left_key_point,left_image_descriptors)
descriptor_extractor->compute(mat_image_right,right_key_point,right_image_descriptors)
Mat result_l,result_r
drawKeypoints(mat_image_left,left_key_point,result_l,Scalar::all(-1),0)
drawKeypoints(mat_image_right,right_key_point,result_r,Scalar::all(-1),0)
//imshow("result_of_left_detector_sift",result_l)
//imshow("result_of_right_detector_sift",result_r)
Mat result_of_sift_match
BruteForceMatcher<段缺L2<float>>matcher
matcher.match(left_image_descriptors,right_image_descriptors,result_of_point_match)
drawMatches(mat_image_left,left_key_point,mat_image_right,right_key_point,result_of_sift_match,result_of_sift_match)
imshow("matches_of_sift",result_of_sift_match)
imwrite("matches_of_sift.jpg",result_of_sift_match)
}
void main()
{
IplImage *n_left_image=cvLoadImage("D:\\lena.jpg")
IplImage *n_right_image=cvLoadImage("D:\\lena_r.jpg")
sift_detector_and_descriptors(n_left_image,n_right_image)
cvWaitKey(0)
}
这纤燃没就是核心代码了,至于opencv所要用到的库,你自己弄一下吧,每个人的opencv版本不一样,这个都市不同毁纳的,希望能够帮到你~
滤波一般指就是一个二维矩阵(卷积核),卷积就是用这个矩阵与原图像进行卷积运算得到一个新的图像。
尺度是一个视觉问题,不是数学问题,简单的来讲就是你在不同距离上观察一个物体,产生的视觉感受是不同的。比如你站在不同距离观察一片雪花,离的越远你感受的形状越接近于a->b->c->d的顺序,就是越远,你看到的越是一个大概的轮廓。
一幅图像的SIFT特征提取,分为4个步骤:
SIFT特征点其实就是尺度空间中稳定的点/极值点,那么,为了得到这些稳定点
对于一幅输入图像,为了进行sift特征检测、实现scale-invariant(任何尺度下都能够有对应的特征点),需要对该图像的尺度空间进行分析,即建立高斯金字塔图像、得到不同scale的图像,这里的高斯金字塔与最原始的高斯金字塔稍微有点区别,因为它在构造尺度空间时,将这些不同尺度图像分为了多个Octave、每个Octave又分为了多层。下图给出了Sift中的高斯金字塔的结构图;
构造完尺度空间(差分高斯金字塔)后,接下来的任务就是“在尺友友宽度中间中检测出图像中的稳定特征点”:
对于DoG中每一个采样点(每一个Octave中每一层),将其与它邻域内所有像素点(8+18=26)进行比较,判断其是否为局部极值点(极大或者极小),更加具体地:如下图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。 一个点如果在DOG尺度空间本层以及上下两层的26个领域中是最大或最小值时,就认为该点是图像在该尺度下的一个特征点。但要注意:这种相邻层之间的极值点的寻找是在同一Octave中的相邻尺度之间进行寻找的,而不要跨组!
通过拟和“三维二次函数”可以精确确定关键点的位置和尺度(达到亚告猜像素精度),具体方法还未知,可以得到一系列的SIFT候选特征点集合,但由于这些关好亮键点中有些具有较低的对比对,有些输属于不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),所以,为了增强匹配稳定性、提高抗噪声能力,应该将这2类关键点去除,实现对候选SIFT特征点集合的进一步净化:
上面只是得到了每个关键点的方向,接下来,需要确定每个关键点的特征向量,具体方式如下:
现有A、B两幅图像,分别利用上面的方法从各幅图像中提取到了k1个sift特征点和k2个特征点及其对应的特征描述子,即k1 * 128维和k2 * 128维的特征,现在需要将两图中各个scale(所有scale)的描述子进行匹配。
接下来采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。
[1] SIFT特征提取及匹配
[2] 图像处理之特征提取
用过OpenCV的Haar+hog特征,但是SIFT不太了解。机制如下:
1,首先利用大量图片(最后正负样本此散均破万)训练得到特征文档xml(程序也许得跑上几天,实验室学长2W张正样本3天2夜)。这个函数我不具体了解,答洞但是森举氏你可以百度如下内容:
Sift 图像特征提取
应该有相关的经验人士做过特征提取,并将教程放在了网上,比如百度经验就是一个平台。
2,图像特征匹配,确定载入函数以及特征文档,Haar特征利用的是CvHaarClassifierCascade函数,Hog用的是detectMultiScale函数封装在了Hog类里面。
至于Sift特征,照你说的,如果有OpenCV特征提取函数,则必然有特征匹配函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)