C++ opencv 访问像素值不正确

标签 c++ opencv

我在 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 打印 1,则保留其余部分。

这是 a.jpg 图片: enter image description here

但它打印出来是这样的

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, 16 bit tiff, png,输出都很奇怪,应该是图像形状(白色部分)

它在最奇怪的 python 上运行良好

感谢任何帮助!

最佳答案

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

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

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

关于C++ opencv 访问像素值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43219004/

相关文章:

c++ - 在 LLVM 3.9.1 中,我应该用什么替换 getGlobalContext()?

c++ - 访问列表 vector 中的结构

c++ - Qt Creator/qmake - 从源目录加载 Assets 文件夹,而不是构建目录

image-processing - 如何使用 OpenCV 将细线提取为单独的轮廓/连接组件?

c++ - IplImage 结构的 boost 序列化问题

c++ - 尝试从另一个进程读取 32 位整数时,ReadProcessMemory 使应用程序崩溃

c++ - 如何在 C++ Builder 中将注册表导出到 *.reg 文件?

c++ - 如何读取 Point vector 的 vector - C++

c - OpenCV视频采集和fps问题

c++ - OpenCV手部识别?