opencv——图片找不同

相信大家都玩过找不同的小游戏,对于相对复杂的图片有时候找花了眼也找不出其中的不同,正好现在在学习opencv,突然想通过opencv实现图片的找不同,这个也是非常的简单。直接上图片。这是从网上找的一张图片,如果出现侵权请联系我删除。这幅图片看起来比较简单,可以很容易的找到,下面通过代码来实现。

首先这是一副完整的图像分为左右两边,在若干部位出现不同,先把图片看成是两幅基本相同的图像拼接在一起,那么出现不同的地方一定是两幅图片中相同的部分,所以只要找出相同的位置不同的颜色显示并标记出来即可。代码实现:图片分为两块进行遍历找出不同。

代码如下

#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/opencv.hpp>
using namespace cv;
#include"iostream"
using namespace std;
Mat find_diff(Mat img){
	int imgrow=img.rows;
	int imgcol=img.cols;
	int channel=img.channels();
	Mat out=Mat::zeros(imgrow,imgcol,CV_8UC3);//返回也是相同大小的图像
	for(int i=0;i<imgrow;i++){
		for(int j=0;j<imgcol/2;j++){   //imgcol/2是将图像从中间分为左右两边进行比较
			for(int k=0;k<channel;k++){
				out.at<Vec3b>(i,j)[k]=img.at<Vec3b>(i,j)[k];
				out.at<Vec3b>(i,j+imgcol/2)[k]=img.at<Vec3b>(i,j+imgcol/2)[k];
				if(out.at<Vec3b>(i,j)[k]!=out.at<Vec3b>(i,j+imgcol/2)[k]){
					out.at<Vec3b>(i,j)[k]=255;
					out.at<Vec3b>(i,j+imgcol/2)[k]=255;//255代表白色的像素值,不同地方用白色标记
				}
			}
		}
	}
	return out;
}
void main(){
	Mat img=imread("3.jpg",IMREAD_COLOR);
	cout << img.rows << " "<< img.cols << endl;
	Mat out=find_diff(img);
	imshow("sample",out);
	waitKey(0);
}

这里要考虑到读取图片的尺寸,用下面语句进行显示,这个牵扯到图片分割的imgcol/2的结果,如果不能被2整除,结果就会受到影响。

cout << img.rows << " "<< img.cols << endl;

上述代码的效果图如下所示,不同的地方被白色进行标记。

猜你喜欢

转载自blog.csdn.net/yuan123890/article/details/107401720