具体原理不太懂,就是在一张图转换为直方图在另一张图上进行匹配?
测试图:
程序:
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <opencv2/opencv.hpp>
using namespace std;
int main()
{
IplImage *img_in = cvLoadImage("test01.jpg");
IplImage *img_hsv = cvCloneImage(img_in);
cvCvtColor(img_in,img_hsv,CV_BGR2HSV);//BGR转HSV
IplImage *h_plane_src = cvCreateImage(cvGetSize(img_in),8,1);
cvSplit(img_hsv,h_plane_src,NULL,NULL,NULL);//分离出H通道的单通道图像
int dims = 1;
int size[] = {256};
float ranges_h[] ={0,255};
float *ranges[] = {ranges_h};
CvHistogram *hist_src = cvCreateHist(1,size,CV_HIST_ARRAY,ranges);
cvCalcHist(&h_plane_src,hist_src);//计算直方图
IplImage *dst = cvLoadImage("test02.jpg");
IplImage *hsv_dst = cvCreateImage(cvGetSize(dst),8,3);
cvCvtColor(dst,hsv_dst,CV_BGR2HSV);//BGR转HSV
IplImage *h_plane_dst = cvCreateImage(cvGetSize(dst),8,1);
cvSplit(hsv_dst,h_plane_dst,NULL,NULL,NULL);//分离出H通道的单通道图像
IplImage *dst_probability = cvCreateImage(cvGetSize(h_plane_dst),IPL_DEPTH_8U,1);
cvZero(dst_probability);
cvCalcBackProject(&h_plane_dst,dst_probability,hist_src);//计算概率相似度
cout<<cvSum(dst_probability).val[0]<<endl;//计算dst_probability各通道所有像素总和
cvShowImage("result",dst_probability);
cvThreshold(dst_probability,dst_probability,200,255,CV_THRESH_BINARY);//阈值化
cvShowImage("dst1",dst_probability);
IplConvKernel *kernel = cvCreateStructuringElementEx(15,15,7,7,CV_SHAPE_RECT);//定义核
cvMorphologyEx(dst_probability,dst_probability,NULL,kernel,CV_MOP_OPEN);//形态学开运算
cvShowImage("dst2",dst_probability);
cvWaitKey();
cvReleaseImage(&img_in);
cvReleaseImage(&img_hsv);
cvReleaseImage(&h_plane_src);
cvReleaseImage(&dst);
cvReleaseImage(&hsv_dst);
cvReleaseImage(&h_plane_dst);
cvReleaseHist(&hist_src);
cvDestroyAllWindows();
}
运行结果:
最右面的白色区域就是匹配上后经过开运算的结果,还是与设想的比较接近的