请查看以下代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
MatND detectContent(Mat image);
MatND getHistogram(Mat image);
int main()
{
Mat image;
try
{
image = imread("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg",CV_LOAD_IMAGE_GRAYSCALE);
cv::rectangle(image,Rect(670,150,60,60),Scalar(255));
if(!image.data)
{
throw 1;
}
}
catch(int a)
{
cout << "Image is unable to read" << endl;
}
//Following will show the selected location of the image for the histogam
namedWindow("Image Selected Location");
imshow("Image Selected Location",image);
//Following will display the edites image
namedWindow("Image");
imshow("Image",image);
imshow("Image",detectContent(image));
waitKey(0);
return 0;
}
MatND detectContent(Mat image)
{
//Regiion of interest
Mat imageROI = image(Rect(900,40,60,100));
//Get the histogram
MatND hist = getHistogram(imageROI);
//Normalizing the histogram
cv::normalize(hist,hist,1.0);
//Backprojecting the image
MatND result;
float *rangeArray;
rangeArray[0] = 0.0;
rangeArray[1] = 255.0;
const float *rans[1];
rans[0] = rangeArray;
int *channels[1];
channels[0] = 0;
cv::calcBackProject(&image,1,0,hist,result,rans,255.0);
return result;
}
MatND getHistogram(Mat image)
{
MatND hist;
int histSize[1];//Number of bins
float hRanges[2];//Max and Min pixel values
const float *ranges[1];
int channels[1];//Only one channel will be used
histSize[0] = 256;
hRanges[0] = 0.0;
hRanges[1] = 255.0;
ranges[0] = hRanges;
channels[0] = 0;
cv::calcHist(&image,1,channels,Mat(),hist,1,histSize,ranges);
return hist;
}
运行此代码时,“背投影”图像为100%黑色!另一个名为“图像选定位置”的图像将在图像的选定位置周围绘制一个白色矩形以用于直方图。我将在下面显示该图像
为什么我的背投影图像是100%黑色?请帮忙!
修改
至少有人可以在他们的机器上试试这个并让我知道结果吗?
答案 0 :(得分:4)
我刚刚测试了你在OS X上发布的代码(结果如下),它运行正常,有两处小修正。
在detectContent()
中,您声明float *rangeArray;
而不初始化它,然后立即取消引用它。这是一个错误。相反,将其声明为:
float rangeArray[2];
其次,提供给cv::calcBackProject()
的范围是排他性的。这意味着您应该更改行
rangeArray[1] = 255.0;
到
rangeArray[1] = 256.0;
如果您希望包含全范围的8位值。否则,任何值为255
的像素都不会包含在直方图中。
此外,imshow("Image",image);
中的行main()
是不必要的。要显示的图像会立即被下一行detectContent()
的结果替换。
答案 1 :(得分:1)