如何正确回放图像?

时间:2013-05-01 09:38:59

标签: c++ image qt opencv image-processing

请查看以下代码

#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%黑色!另一个名为“图像选定位置”的图像将在图像的选定位置周围绘制一个白色矩形以用于直方图。我将在下面显示该图像

enter image description here

为什么我的背投影图像是100%黑色?请帮忙!

修改

至少有人可以在他们的机器上试试这个并让我知道结果吗?

2 个答案:

答案 0 :(得分:4)

我刚刚测试了你在OS X上发布的代码(结果如下),它运行正常,有两处小修正。Backprojected penguins

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)

尝试在此行中将范围设置为1

CV :: calcBackProject(安培;图像,1,0,HIST,结果,失败者,255.0);

并设置统一标志

我是从here

得到的