【问题标题】:c++ opencv access pixel value incorrectc++ opencv访问像素值不正确
【发布时间】:2017-04-04 22:49:26
【问题描述】:

当我在 C++ 中使用 img.at(y,x) 访问像素值时遇到了一些问题,这是我的代码:

   int main( int argc, char** argv )
{
    Mat image;
    image = imread("a.jpg",-1);   
 int a;
  for(int x = 0; x<image.rows;x++)
    {
      cout<<endl;
      for(int y = 0; y< image.cols; y++)
      {
       a = (int)image.at<uchar>(y,x);
       if(a>200)
       {
       cout<<"1 ";
       }else{
       cout<<a<<" ";
       }
      }
    }
}

所以该函数将迭代所有像素,然后如果它是 255 print 1,则剩余。

这是 a.jpg 图片:

但打印出来是这样的

0 0 0 0 0 0 1 0 1 0 0 0 7 0 0 7 0 0 0 1 0 1 0 0 
0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 1 3 0 0 0 0 0 
0 0 0 0 0 0 0 5 0 2 0 1 0 1 1 0 1 0 2 0 5 0 0 0 
0 0 0 0 0 0 1 0 0 2 0 2 0 1 1 0 2 0 2 0 0 1 0 0 
0 0 0 0 0 0 0 2 0 1 0 0 1 1 1 0 0 0 2 0 2 0 0 0 
0 0 0 0 0 0 4 0 0 1 1 1 1 1 1 1 1 0 0 2 0 3 0 0 
0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 2 0 0 0 0 0 
0 0 0 0 0 0 0 4 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 2 0 2 0 1 0 0 0 
0 0 0 0 0 0 0 1 1 1 1 1 1 0 2 0 0 0 2 0 2 0 0 0 
0 0 0 0 0 0 1 1 1 1 1 1 0 2 0 0 2 2 0 1 0 0 0 0 
0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 3 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 5 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 4 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 3 0 0 0 2 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 3 0 1 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 2 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 1 0 0 0 7 0 0 7 0 0 0 1 0 1 0 0 0 
0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 1 3 0 0 0 0 0 0 
0 0 0 0 0 0 5 0 2 0 1 0 1 1 0 1 0 2 0 5 0 0 0 0 
0 0 0 0 0 1 0 0 2 0 2 0 1 1 0 2 0 2 0 0 1 0 0 0 
0 0 0 0 0 0 2 0 1 0 0 1 1 1 0 0 0 2 0 2 0 0 0 0 
0 0 0 0 0 4 0 0 1 1 1 1 1 1 1 1 0 0 2 0 3 0 0 0 
0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 2 0 0 0 0 0 0 
0 0 0 0 0 0 4 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 
0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 
0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 2 0 2 0 1 0 0 0 0 
0 0 0 0 0 0 1 1 1 1 1 1 0 2 0 0 0 2 0 2 0 0 0 0

有人知道原因吗?我试过8bit jpg,16bit tiff,png,输出都很奇怪,应该是图像形状(白色部分)

它在 python 上运行良好,这是最奇怪的事情

任何帮助表示赞赏!

【问题讨论】:

  • 将图片转为灰度,或者先加载为灰度。
  • 你像 Kochoba 在他的回答中提到的那样混淆了 x 和 y。试试a = (int)image.at&lt;uchar&gt;(x,y) 看看opencv tutorial 如何有效地循环垫子。
  • @PSchn 非常感谢!这真的很有帮助!

标签: c++ opencv


【解决方案1】:

在您的代码中,您已将 x 设置为行,将 y 设置为列。当您从矩阵中读取数据时,您必须交换变量。这个公式是行顺序而不是列顺序。

a = (int)image.at<uchar>(x,y);

您还可以阅读以下 SO post 关于行顺序和列顺序之间的混淆。

【讨论】:

  • 帮助很大!非常感谢! jpg 图像工作正常,但在 tif 和 png 中仍然存在一些其他问题,我将提出一个新问题,非常感谢!
【解决方案2】:
image = imread("a.jpg", CV_LOAD_IMAGE_GRAYSCALE); 

【讨论】:

  • 谢谢回复,因为a.jpg是单通道灰度,结果是一样的。
  • @MMzztx 不,当您使用 imread 时,它将加载带有 BGR 通道的图像,在您的情况下,您使用 -1,它也将具有 alpha,但如果您使用 CV_LOAD_IMAGE_GRAYSCALE,它将加载它将 Mat 图像作为单通道图像。 docs.opencv.org/3.0-beta/modules/imgcodecs/doc/… imread(const String& 文件名,int 标志)
  • 谢谢,所以根据我的理解,-1 将返回加载图像,就像使用 alpha 一样,即使我使用 CV_LOAD_IMAGE_GRAYSCALE,我实际上已经尝试过它仍然会返回上面的数组我的问题。
  • @MMzztx,jpeg 是有损的,意味着它有压缩伪像,所以接下来我会尝试在绘画中制作纯黑白图像,并将其保存为无损格式,然后加载它CV_LOAD_IMAGE_GRAYSCALE。
  • 使用 tif 和 png 和 CV_LOAD_IMAGE_GRAYSCALE 只会返回全 0...这在 python 上很奇怪,无论 jpg、png 或 tiff 它们都返回正确的像素值
猜你喜欢
  • 2011-03-18
  • 2014-01-03
  • 1970-01-01
  • 2018-03-26
  • 2018-02-09
  • 2012-02-14
  • 1970-01-01
  • 2013-07-28
相关资源
最近更新 更多