【问题标题】:How can I read the pixel values in OpenCV?如何读取 OpenCV 中的像素值?
【发布时间】:2014-05-10 00:16:11
【问题描述】:

我正在尝试使用此代码通过此代码计算我的二进制图像像素值:

int main()
{
    Mat img;

    img=imread("/home/2b.jpeg", CV_LOAD_IMAGE_UNCHANGED);
    namedWindow("win", WINDOW_AUTOSIZE);
    imshow("win", img);

    for(int i=0; i< img.rows ;i++)
    {
        for(int j=0; j< img.cols ; j++)
        {
            cout<<setw(10)<<img.at<int>(i,j);
        }
        cout<<endl<<endl<<endl;
    }

    waitKey(0);

    return 0;
}

但我得到 3 种类型的值:0、-1 和一些大的不同数字,例如(24342234、1324244242 等)

有什么问题?我在绘图程序中画了一条黑线并保存图像,或从互联网下载二进制图像,但我得到相同的结果!

我认为当我使用二进制图像时,我必须为白色像素获取 0,为黑色像素获取 255。

【问题讨论】:

    标签: c++ opencv image-processing pixel


    【解决方案1】:

    首先,您应该使用uchar (unsigned char) 类型而不是int 来访问其像素。

    cout 时,您必须显式转换为其他类型,如int 才能正确打印它,因为当cout 的值大于127 时,打印unsigned char 时会很奇怪。否则,它将打印一些 垃圾值(或什么也不打印),因为它只是一个 不可打印 ASCII 字符,无论如何都会被打印出来。查看Why "cout" works weird for "unsigned char"?

    cout << setw(10) << (int) img.at<uchar>(i,j);
                        ^^^^^        ^^^^^             
    

    【讨论】:

      【解决方案2】:

      您正在尝试访问整数值,而实际上您的垫子是 uchar。尝试将内部循环线更改为:

      cout<<setw(10)<<img.at<uchar>(i,j);
      

      【讨论】:

      • 像素值大于127的时候还是会产生意想不到的结果。详情看我的回答。
      【解决方案3】:

      尝试将其加载为 CV_IMAGE_GRAYSCALE,并使用image.at&lt; uchar&gt;(y,x) 访问像素值。

      【讨论】:

      • 谢谢!它有效,但我想知道为什么当我选择 CV_LOAD_IMAGE_(other options) 时,它不起作用?
      • @user3486308 对于灰度图像,它应该适用于CV_IMAGE_GRAYSCALECV_LOAD_IMAGE_UNCHANGED
      • 谢谢英雄胡永涛。
      猜你喜欢
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 2015-09-01
      • 1970-01-01
      • 2014-04-05
      • 2018-07-13
      相关资源
      最近更新 更多