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;

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

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值