用手機拍攝同一場景的兩張照片,拍攝位置略有不同。
分別進行如下操作:
1、src1 減去 scr2求絕對值=>diff12
2、對diff12先進行腐蝕,在進行膨脹操作;
3、對diff12先進行膨脹,在進行腐蝕操作;
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <stdio.h>
#include <cstdlib>
using namespace std;
using namespace cv;
int main(int argc, const char * argv[]) {
/*1.載入圖像*/
const char filename1[] = "/Users/linwang/DownLoads/Pic1.jpg";
const char filename2[] = "/Users/linwang/DownLoads/Pic2.jpg";
IplImage * Img1 = cvLoadImage(filename1);
IplImage * Img2 = cvLoadImage(filename2);
/*2.縮放圖像*/
double fScale = 0.1; //縮放倍數
CvSize czSize; //目標圖像尺寸
czSize.width = Img1->width * fScale;
czSize.height = Img1->height * fScale;
IplImage * New_Img1 = cvCreateImage(czSize, Img1->depth , Img1->nChannels);
cvResize(Img1, New_Img1);
IplImage * New_Img2 = cvCreateImage(czSize, Img2->depth , Img2->nChannels);
cvResize(Img2, New_Img2);
cout<<New_Img1->width<<" -> "<<New_Img1->height<<endl;
cout<<New_Img2->width<<" -> "<<New_Img2->height<<endl;
cvNamedWindow("Pic1");
cvNamedWindow("Pic2");
cvShowImage("Pic1", New_Img1);
cvShowImage("Pic2", New_Img2);
/*3.計算img1 和 img2差值的絕對值*/
IplImage * diff12 = cvCloneImage(New_Img1);
cvSetZero(diff12);
cvAbsDiff(New_Img1, New_Img2, diff12);
cvNamedWindow("ABSDIFF");
cvShowImage("ABSDIFF", diff12);
/*4對DIFF先進行腐蝕,然後進行膨脹,結果寫爲cleandiff*/
IplImage * cleandiff = cvCloneImage(diff12);
cvSetZero(cleandiff);
cvErode(diff12, cleandiff); //腐蝕操作
cvDilate(cleandiff, cleandiff); //膨脹操作,支持in-place
cvNamedWindow("cleandiff");
cvShowImage("cleandiff", cleandiff);
/*對DIFF先進行膨脹,然後進行腐蝕,結果寫爲dirtydiff*/
IplImage * dirtydiff = cvCloneImage(diff12);
cvDilate(diff12, dirtydiff);
cvErode(dirtydiff, dirtydiff);
cvNamedWindow("dirtydiff");
cvShowImage("dirtydiff", dirtydiff);
cvWaitKey(0);
return 1;
}