SIFT+RANSAC做图像矫正

article/2025/8/22 21:25:55
做图像矫正时使用了一下sift算法,尽管sift确实很牛,但还是会出现一些误匹配,直接计

算两张影像的单应矩阵会出现很大误差,因此可以在计算时使用RANSAC算法在单应矩
阵的约束下剔除误匹配,并计算单应矩阵,基本思路为:1、进行sift匹配。2、
RANSAC计算单应矩阵。3、使用插值函数进行重采样。基于OpenCV的c++代码:

int main(int argc,char* argv[])
{Mat img_1=imread("2Rotation5.png",CV_LOAD_IMAGE_GRAYSCALE);//宏定义时CV_LOAD_IMAGE_GRAYSCALE=0,也就是读取灰度图像Mat img_2=imread("2Rotation1.png",CV_LOAD_IMAGE_GRAYSCALE);//一定要记得这里路径的斜线方向,这与Matlab里面是相反的if(!img_1.data || !img_2.data)//如果数据为空{cout<<"opencv error"<<endl;return -1;}cout<<"open right"<<endl;//第一步,用SIFT算子检测关键点SiftFeatureDetector detector;//构造函数采用内部默认的std::vector<KeyPoint> keypoints_1,keypoints_2;//构造2个专门由点组成的点向量用来存储特征点detector.detect(img_1,keypoints_1);//将img_1图像中检测到的特征点存储起来放在keypoints_1中detector.detect(img_2,keypoints_2);//同理//在图像中画出特征点
//  Mat img_keypoints_1,img_keypoints_2;
// 
//  drawKeypoints(img_1,keypoints_1,img_keypoints_1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);//在内存中画出特征点
//  drawKeypoints(img_2,keypoints_2,img_keypoints_2,Scalar::all(-1),DrawMatchesFlags::DEFAULT);
// 
//  imshow("sift_keypoints_1",img_keypoints_1);//显示特征点
//  imshow("sift_keypoints_2",img_keypoints_2);//计算特征向量SiftDescriptorExtractor extractor;//定义描述子对象Mat descriptors_1,descriptors_2;//存放特征向量的矩阵extractor.compute(img_1,keypoints_1,descriptors_1);//计算特征向量extractor.compute(img_2,keypoints_2,descriptors_2);//用burte force进行匹配特征向量BruteForceMatcher<L2<float>>matcher;//定义一个burte force matcher对象vector<DMatch>matches;matcher.match(descriptors_1,descriptors_2,matches);double max_dist=0,min_dist=100;for (int i=0;i<descriptors_1.rows;i++){double dst=matches[i].distance;if(dst<min_dist)min_dist=dst;if(dst>max_dist)max_dist=dst;}std::vector<DMatch>good_matches;for (int i=0;i<descriptors_1.rows;i++){if (matches[i].distance<3*min_dist){good_matches.push_back(matches[i]);}}std::vector<Point2f>obj;std::vector<Point2f>scene;for (int i=0;i<good_matches.size();i++){obj.push_back(keypoints_1[good_matches[i].queryIdx].pt);scene.push_back(keypoints_2[good_matches[i].trainIdx].pt);}Mat h=findHomography(obj,scene,CV_RANSAC);Mat ts_img;Mat color_img_1=imread("2Rotation5.png");Mat color_img_2=imread("2Rotation1.png");warpPerspective(color_img_1,ts_img,h,Size(img_1.size().width,img_1.size().height));imshow("res",ts_img);imwrite("result.bmp",ts_img);Point2f *srcTri=new Point2f[matches.size()];Point2f *dstTri=new Point2f[matches.size()];//设置原图像和目标图像的同名点for (int i=0;i<matches.size();i+=20){srcTri[i]=keypoints_1[matches[i].queryIdx].pt;dstTri[i]=keypoints_2[matches[i].trainIdx].pt;}FlannBasedMatcher macher;Mat warp_mat(2,3,CV_32FC1);warp_mat=getAffineTransform(srcTri,dstTri);//cout<<warp_mat;//getchar();//绘制匹配线段Mat img_matches;drawMatches(img_1,keypoints_1,img_2,keypoints_2,matches,img_matches);//将匹配出来的结果放入内存img_matches中//显示匹配线段imshow("sift_Matches",img_matches);//显示的标题为MatcheswaitKey(0);return 0;}

参考影像
待校正影像
矫正结果


http://chatgpt.dhexx.cn/article/1XFPH56f.shtml

相关文章

opencv沿斜线切割图片

opencv沿斜线切割图片 opencv如果沿水平或者数值的线来切割图片&#xff0c;是很简单的。但是&#xff0c;如果沿着斜线&#xff0c;那么就不能直接进行切割了。 我的思路是&#xff0c;根据直线上两点来确定直线方程&#xff0c;然后&#xff0c;逐个遍历图像中元素&#xf…

mean shift 图像分割(三)

Reference: [1] Mean shift: A robust approach toward feature space analysis, PAMI, 2002 [2] mean shift,非常好的ppt &#xff0c;百度文库链接 [3] Pattern Recognition and Machine Learning, Bishop, 2006&#xff0c;Sec 2.5 [4] Computer Vision Algorithms and App…

mean shift 图像分割(一、二、三)

MeanShift图像分割算法&#xff1a;大概是将复杂的背景&#xff0c;通过粗化提取整体信息&#xff0c;进而将图像分割。 接下来我想&#xff0c;将会抽出一部分时间&#xff0c;研究一下这个算法&#xff0c;以最终实现手势形状提取。 《Mean Shift: A Robust Approach Towar…

OpenCV在图像上画正弦曲线(c++)

写在前面&#xff1a;欢迎来到「湫歌」的博客。我是秋秋&#xff0c;一名普通的在校大学生。在学习之余&#xff0c;用博客来记录我学习过程中的点点滴滴&#xff0c;也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获&#xff01;希望大家多多关照&#xff0c;我们一…

基于mean shift的图像分割

1 mean shift算法 Mean Shift 这个概念最早是由Fukunaga 等人[1]于1975 年在一篇关于概率密度梯度函数的估计中提出来的,其最初含义正如其名,就是偏移的均值向量,在这里Mean Shift 是一个名词,它指代的是一个向量,但随着Mean Shift 理论的发展,Mean Shift 的含义也发生了变化,如…

OpenCV对图像进行切边

1、概述 案例&#xff1a;使用OpenCV对旋转图片及正常图片进行切边。 A&#xff1a;对正常图片切边的步骤 1.加载图像 2.对图像进行灰度化 3.边缘检测 4.轮廓发现 5.找出符合目标的最大外接矩形&#xff0c;并使用矩形的四个坐标点绘制线 6.根据找到Rect在原图上切除ROI区域 7.…

双曲正割matlab求解

&#xff0c;取N305&#xff0c;且x在区间内按照5等分取值。 matlab中对于双曲正割函数可以直接用sech求解&#xff0c;自己编代码的过程永远无法逃避&#xff0c;&#xff0c;因为这个有现成的&#xff0c;那个可能没有&#xff0c;遇到棘手复杂的任务&#xff0c;全靠现成调包…

MATLAB:图像裁切(imcrop函数)

对图像进行裁切可用imcrop函数&#xff0c;实现过程如下&#xff1a; close all; %关闭当前所有图形窗口&#xff0c;清空工作空间变量&#xff0c;清除工作空间所有变量 clear all; clc; [A,map]imread(peppers.png); %读入图像 rect[75 68 130 112]; …

matlab关于图像切割的一些总结:imcrop,getrect,ndgrid,函数

之前查看这么多人写的博客&#xff0c;乱七八糟的&#xff0c;说法不一还有些有错误&#xff0c;误导人。现在记下来&#xff0c;希望给后来人一点指引。 1.imcrop函数 这个函数是 imcrop的第一二元素代表左上角的横纵坐标&#xff0c;第三四元素代表矩行框的宽高 pic imre…

代码实现数学图形之常用函数,幂,对数,指数,正弦,余弦,正切,余切,反正弦,反余弦,反正切,反余切,双曲正弦,双曲余弦,双曲正切,双曲余切,正割函数,余割函数,双曲正割,双曲正割.

(1)幂函数 X的N次幂. 按 CtrlC 复制代码 按 CtrlC 复制代码 脚本代码中X,N都为变量,两个变量会生成一个二维数据,得到一个平面图形.pow_sign是一个保留正负号的pow函数,其C实现为: static float yf_pow_sign(float a, float b) {float s yf_sign(a);a ::fabsf(a);if (…

几何画板如何绘制动态正切函数图像

几何学中必学内容包括三角函数&#xff0c;而三角函数又包括正弦函数、余弦函数、正切函数和余切函数。在黑板上很难准确画出这些三角函数&#xff0c;现在有了几何画板&#xff0c;可以快速而准备的构造出三角函数&#xff0c;下面就给大家介绍在几何画板中动态绘制正切函数图…

mean shift 图像分割(二)

Reference: [1] Mean shift: A robust approach toward feature space analysis, PAMI, 2002 [2] mean shift,非常好的ppt &#xff0c;百度文库链接 [3] Pattern Recognition and Machine Learning, Bishop, 2006&#xff0c;Sec 2.5 [4] Computer Vision Algorithms and App…

GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割

&#xfeff;&#xfeff; One cut in grabcut&#xff08;grabcut算法的非迭代实现&#xff1f;&#xff09; 本文针对交互式图像分割中的图割算法&#xff0c;主要想翻译一篇英文文献。不足之处请大家指正。 这是博主近期看到的效果最好&#xff0c;实现最简单&#xff0c;运…

mean shift 图像分割 (一)

mean shift 图像分割 Reference: [1] Mean shift: A robust approach toward feature space analysis, PAMI, 2002 [2] mean shift,非常好的ppt &#xff0c;百度文库链接 [3] Pattern Recognition and Machine Learning, Bishop, 2006&#xff0c;Sec 2.5 [4] Computer Vision…

【图像处理】图像分割之(一~四)GraphCut,GrabCut函数使用和源码解读(OpenCV)

图像分割之&#xff08;一&#xff09;概述 http://blog.csdn.net/zouxy09 所谓图像分割指的是根据灰度、颜色、纹理和形状等特征把图像划分成若干互不交迭的区域&#xff0c;并使这些特征在同一区域内呈现出相似性&#xff0c;而在不同区域间呈现出明显的差异性。我们先对目前…

Mac 安装使用 OpenCV 图像处理神器

大家好&#xff0c;我是青空。 最近在折腾图像处理相关的事情&#xff0c;今天就给大家分享一下&#xff0c;Mac 上如何安装和使用 OpenCV。 安装 方法一 使用homebrew安装 其实 Mac 上安装 OpenCV 很简单&#xff0c;一个命令行就能搞定。 brew install opencv等待完成即…

sec和asec--正割和反正割函数

【功能简介】求变量的正割和反正割。 【语法格式】 1&#xff0e;Ysec (X) 计算X的正割&#xff0c;sec(x)1/cos(x)。X可以为向量、矩阵或多维数组&#xff0c;X中的元素可以为复数&#xff0c;所有表示角度的变量都采用弧度来表示。 2&#xff0e;Yasec (X) 计算X的反正割。对…

Graph Cut(图割算法)

转载自&#xff1a;http://blog.csdn.net/zouxy09/article/details/8532111 Graph cuts是一种十分有用和流行的能量优化算法&#xff0c;在计算机视觉领域普遍应用于前背景分割&#xff08;Image segmentation&#xff09;、立体视觉&#xff08;stereo vision&#xff09;、抠…

sech和asech--双曲正割和反双曲正割函数

【功能简介】求变量的双曲正割和反双曲正割。 【语法格式】 1&#xff0e;Ysech(X) 计算X的双曲正割&#xff0c;sech(x)1/cosh(x)。X可以为向量、矩阵或多维数组&#xff0c;X中的元素可以为复数&#xff0c;所有表示角度的变量都采用弧度来表示。 2&#xff0e;Yasech (X) 计…

三角函数中的正弦、余弦、正切、余切、正割、余割函数性质及常用公式

三角函数 三角函数包括正弦、余弦、正切、余切、正割、余割函数 0 基础知识 正弦&#xff08;Sine&#xff09;&#xff1a;sin A CB/CA 余弦&#xff08;Cosine&#xff09; &#xff1a;cos A AB/CA 正切&#xff08;Tangent&#xff09;&#xff1a;tan A CB/BA 余切&a…