在學習 《學習opencv》的cvCalcBackProject時自己寫的例子
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <opencv2/opencv.hpp>
using namespace std;
int main()
{
IplImage *src = cvLoadImage("f:\\images\\hand00.jpg");
IplImage *hsv_src = cvCloneImage(src);
cvCvtColor(src,hsv_src,CV_BGR2HSV);
IplImage *h_plane_src = cvCreateImage(cvGetSize(src),8,1);
cvSplit(hsv_src,h_plane_src,NULL,NULL,NULL);
cvSave("h.xml",h_plane_src);
int dims = 1;
int size[] = {180};
float ranges_h[] ={0,181};
float *ranges[] = {ranges_h};
CvHistogram *hist_src = cvCreateHist(1,size,CV_HIST_ARRAY,ranges);
cvCalcHist(&h_plane_src,hist_src);
IplImage *dst = cvLoadImage("f:\\images\\hand1.jpg");
IplImage *hsv_dst = cvCreateImage(cvGetSize(dst),8,3);
cvCvtColor(dst,hsv_dst,CV_BGR2HSV);
IplImage *h_plane_dst = cvCreateImage(cvGetSize(dst),8,1);
cvSplit(hsv_dst,h_plane_dst,NULL,NULL,NULL);
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;
cvShowImage("result",dst_probability);
cvThreshold(dst_probability,dst_probability,250,255,CV_THRESH_BINARY);
cvShowImage("dst1",dst_probability);
IplConvKernel *kernel = cvCreateStructuringElementEx(31,31,15,15,CV_SHAPE_RECT);
cvMorphologyEx(dst_probability,dst_probability,NULL,kernel,CV_MOP_OPEN);
cvShowImage("dst2",dst_probability);
cvWaitKey();
cvReleaseImage(&src);
cvReleaseImage(&hsv_src);
cvReleaseImage(&h_plane_src);
cvReleaseImage(&dst);
cvReleaseImage(&hsv_dst);
cvReleaseImage(&h_plane_dst);
cvReleaseHist(&hist_src);
cvDestroyAllWindows();
} 其中hand00.jpg圖片為:
第二次讀入的圖片可為:
輸出的結(jié)果:
這就是《學習opencv》上的示例圖(但沒給出源碼)
opencv文檔中介紹的該算法可以用來搜索物體(英文,,查查字典,,讀起來也簡單) :
1. Calculate a hue histogram for the red object assuming the image contains only this object. The histogram is likely to have a strong maximum, corresponding to red color. 2. Calculate back projection of a hue plane of input image where the object is searched, using the histogram. Threshold the image. 3. Find connected components in the resulting picture and choose the right component using some additional criteria, for example, the largest connected component.
按我的理解的話,就是:對于后來的輸入圖像,backproject未得的圖像只是個概率圖
比如在原來未hist直方圖時,有個像素值BGR(100,200,102)的像素點很多 , 那么在求得的hist直方圖中對應位置的值就越大(概率越大),。
所以呢,如果對目標圖使用backproject時,,目標圖中像素值等于BGR(100,200,102)的像素點的概率越大,,表現(xiàn)為cvCalcBackProject得出結(jié)果中對應像素位置的灰度值大。
表現(xiàn)在此例中的意思就是: 由于我們只計算了原始圖像的HSV色彩空間中的H色度分量,。 原始圖中,手的膚色對應的色度和黑色對應的色度的像素點是最多的,。
那么反向投影到目標圖像時,, 目標圖像像素色度為 手的膚色和黑色對應的色度 的概率越大, 輸出的對應位置的灰度圖就越大,。
|