在OpenCV中访问Mat二进制图像元素

时间:2012-07-11 13:54:30

标签: c++ image-processing opencv computer-vision

我尝试使用以下代码打印此二进制图像的所有白色像素但未成功:

Mat grayImage;
Mat rgb_Image;
int Max_value = 255;
int Global_Threshold = 155;

rgb_Image = imread( "../Tests/Object/Object.jpg", CV_LOAD_IMAGE_COLOR);   // Read the file

if(! rgb_Image.data )  // Check for invalid input
{
        cout <<  "Could not open or find the image" << endl ;
        return -1;
}

//Convert to Grayscale.
cvtColor(rgb_Image, grayImage, CV_BGR2GRAY);

//Binarize the image with a fixed threshold.
threshold( grayImage, binImage, Global_Threshold, Max_Value, 0);

//Printing white pixels
for(int i = 0; i < 640; i++)
{
    for(int j = 0; j < 480; j++)
    {
        if(255 == binImage.at<float>(i,j))
        {
            cout << binImage.at<float>(i,j) << endl;
        }
    }
}

如果我打印的值不是零,我会得到奇怪的值而不是255。

谢谢,

2 个答案:

答案 0 :(得分:4)

cvtColor将创建一个uchar图像,阈值将保留数据格式,因此你的binImage是由uchars组成的,而不是float的。

更改

binImage.at<float>(i,j)

binImage.at<uchar>(i,j)

并记住,将浮点数与==进行比较通常是一个坏主意(即使使用浮点数),因为浮点表示错误。您可能最终得到一个满254.9999999999的矩阵,并且永远不会满足image(i,j)==255条件

答案 1 :(得分:1)

你需要将它投射到浮动状态。

虽然图像是openCV浮点数,但它仍然存储在unsigned char *数据块中(因此可以很容易地转换)所以&#34;&lt;&lt;&#认为它收到一个C字符串并打印二进制数据,直到它看到&#39; 0&#39;