OpenCV反向投影cvCalcBackProject的示例,用图像中某中颜色的区域

在学习 《学习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图片为:



第二次读入的图片可为:




输出的结果:



这就是《学习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)的像素点的概率越大,表现为cvCalcBackProject得出结果中对应像素位置的灰度值大。


表现在此例中的意思就是: 由于我们只计算了原始图像的HSV色彩空间中的H色度分量。 原始图中,手的肤色对应的色度和黑色对应的色度的像素点是最多的。

那么反向投影到目标图像时, 目标图像像素色度为 手的肤色和黑色对应的色度 的概率越大, 输出的对应位置的灰度图就越大。

原文链接:http://blog.csdn.net/fdl19881/article/details/6725347


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值