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

C++ 在OpenCV中访问Mat二进制图像元素,c++,image-processing,opencv,computer-vision,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 inpu

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

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;
        }
    }
}
Mat灰度图像;
Mat-rgb_图像;
int Max_值=255;
int全局_阈值=155;
rgb_Image=imread(../Tests/Object/Object.jpg),CV_LOAD_Image_COLOR);//读文件
if(!rgb_Image.data)//检查输入是否无效
{

cout您需要将其投射到浮动


尽管图像是一个openCV浮点值,但它仍然存储在一个无符号的char*数据块中(因此可以轻松转换),因此“您需要将其转换为浮点值


尽管图像是openCV浮点图像,但它仍然存储在一个无符号字符*数据块中(因此可以轻松转换),因此“cvtColor将创建一个uchar图像,threshold将保留数据格式,因此binImage由uchars组成,而不是浮点图像

改变

binImage.at<float>(i,j)
binImage.at(i,j)

binImage.at(i,j)

请记住,由于浮点表示错误,将浮点与
==
进行比较通常是一个坏主意(即使在使用浮点时也是如此)。您可能会得到一个满是
254.9999999999
的矩阵,并且永远不会满足
图像(i,j)==255
条件

cvtColor将创建一个uchar图像,而threshold将保留数据格式,因此您的binImage由uchar组成,而不是由float组成

改变

binImage.at<float>(i,j)
binImage.at(i,j)

binImage.at(i,j)

请记住,由于浮点表示错误,将浮点与
==
进行比较通常是一个坏主意(即使在使用浮点时也是如此)。您可能会得到一个满是
254.9999999999
的矩阵,并且永远不会满足
图像(i,j)=255</COD>条件

在运行时,我的Visual C++用“二进制图像的值像素元素”的解决方案创建了一个“断言失败”的错误…这是访问二进制图像中像素值的正确方法吗?没有正确的方法-您必须在模板中指定正确的数据类型,这可能与您的情况不同。确定。如果我想用像素值(0)填充空白的白色垫子(1280x720)在一个特定的点上,我怎么办?开始的是OpenCV文档。你看过了吗?我找到了一个解决方案……问题是我如何初始化初始矩阵。现在都好了。谢谢!在运行时,我的项目Visual C++用“二进制图像的值像素元素”的解决方案创建了一个“断言失败”的错误。…这是访问二进制图像中像素值的正确方法吗?没有正确的方法-您必须在模板中指定正确的数据类型,这可能与您的情况不同。确定。如果我想用像素值(0)填充空白的白色垫子(1280x720)在一个特定的点上,我该怎么做?起点是OpenCV文档。你看过了吗?我找到了一个解决方案…我的问题是如何实例化初始矩阵。现在一切都好了。谢谢!