前言
1.有一个小游戏,就给出两张内容几乎差不多全部相同的图像,让大家在最快的时间内找出两个图像中有几处不同地方,我这里试着用OpenCV实现这个功能。
2.我的编程环境是Windows 10 64位,IDE是VS2019,配置了OpenCV 4.5,实现语言是C++。是于如果配置以上的环境,可以看我之前写的博文。
一、资源准备
可以在网上搜《图片大找茬》,然后下载两张相似的图像,但图像的大小必须一样。下面是我指用的两张图像。如果不一样,就用resize()这个函数去调整两张图像的尺寸。
二、代码演示
1.这里用到的是OpenCV图像基本运算,两图相减。使用的API是subtract()。
代码是传入两张图像
void imageSubtract(Mat &image1, Mat &image2)
{if ((image1.rows != image2.rows) || (image1.cols != image2.cols)){if (image1.rows > image2.rows){resize(image1, image1, image2.size(), 0, 0, INTER_LINEAR);}else if (image1.rows < image2.rows){resize(image2, image2, image1.size(), 0, 0, INTER_LINEAR);}}Mat image1_gary, image2_gary;if (image1.channels() != 1){cvtColor(image1, image1_gary, COLOR_BGR2GRAY);}if (image2.channels() != 1){cvtColor(image2, image2_gary, COLOR_BGR2GRAY);}Mat frameDifference, absFrameDifferece;Mat previousGrayFrame = image2_gary.clone();//图1减图2subtract(image1_gary, image2_gary, frameDifference, Mat(), CV_16SC1);//取绝对值absFrameDifferece = abs(frameDifference);//位深的改变absFrameDifferece.convertTo(absFrameDifferece, CV_8UC1, 1, 0);imshow("absFrameDifferece", absFrameDifferece);Mat segmentation;//阈值处理(这一步很关键,要调好二值化的值)threshold(absFrameDifferece, segmentation,100, 255, THRESH_BINARY);//中值滤波medianBlur(segmentation, segmentation, 3);//形态学处理(开闭运算)//形态学处理用到的算子Mat morphologyKernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));morphologyEx(segmentation, segmentation, MORPH_CLOSE, morphologyKernel, Point(-1, -1), 2, BORDER_REPLICATE);//显示二值化图片imshow("segmentation", segmentation);//找边界vector< vector<Point> > contours;vector<Vec4i> hierarchy;findContours(segmentation, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));//CV_RETR_TREEvector< vector<Point> > contours_poly(contours.size());vector<Rect> boundRect;boundRect.clear();for (int index = 0; index < contours.size(); index++){approxPolyDP(Mat(contours[index]), contours_poly[index], 3, true);Rect rect = boundingRect(Mat(contours_poly[index]));rectangle(image2, rect, Scalar(0, 255, 0), 2);}imshow("效果图", image2);
}
2.运行效果
结语
例子很简单,但是这个方法用到移动目标追踪的上去,就是两帧差。
总结
以上是生活随笔为你收集整理的OpenCV图像处理——对比两张图像差异的位置并标记的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。