如何在opencv中创建可用于calcBackProject的直方图?

时间:2013-08-28 14:49:27

标签: opencv image-processing

我已将直方图指定为

MatND skinCrCbHist =Mat::zeros(Size(256,256),CV_8UC1);

ellipse(skinCrCbHist, Point(113, 155.6), Size(283.4, 159.2), 43.0, 0.0, 360.0, Scalar(255), -1); // Using a really big ellipse to find any sort of back projection in CrCb domain.

cvtColor(src, ycrcb, CV_BGR2YCrCb); //src is input, image of a person
float crrange[]={0,255};
float cbrange[]={0,255};
const float* ranges[]={crrange,cbrange};
int channelsy[]={1,2};
calcBackProject( &ycrcb, 1, channelsy, skinCrCbHist, backproj, ranges, 255, true );
imshow("bp",backproj);

我面临的问题是backproj显示完全黑色的图像。 当我使用在自然图像上使用calcHist创建的普通直方图时,我确实得到某种反投影。但是我如何使用直方图,我通过指定椭圆来人工创建,以获得反投影。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你可以使用原始calcHist函数的掩码。

您没有指定您使用的是哪个版本的OpenCV,因此我将假设最新的2.4.6.0。方法原型如下(省略默认值和类型):

calcHist(images, nimages, channels, mask, hist, dims, histSize, ranges)

第三个参数是mask。掩码意味着该函数将忽略与掩码中的零像素匹配的所有像素。在程序中,掩码是另一个正确设置的图像。

这是您的伪代码问题:

1) get input image
2) create matrix of same size as input of type CV_8UC1 filled with zeros
3) draw white (value 255) ellipse on the new image
4) call caclHist with the new image as mask

http://docs.opencv.org/modules/imgproc/doc/histograms.html