日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV图像处理——对比两张图像差异的位置并标记

發布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV图像处理——对比两张图像差异的位置并标记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

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图像处理——对比两张图像差异的位置并标记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。