【问题标题】:OpenCV outputing odd pixel valuesOpenCV输出奇数像素值
【发布时间】:2014-03-22 10:11:49
【问题描述】:

我想用 C++ 对图像进行处理,并且一直在使用 OpenCV。不过,在尝试单独访问每个像素时,我有点卡住了。我可以使用以下方法输出整个灰度图像:

cout << image;

并得到预期的输出值,如下所示:

[143, 147, 164, 177, 177, 185, 196, 195, 185, 186, 178, 190, 178, 163, 183...

但是当我尝试一次输出一个像素时:

for (int y = 0; y < image.rows; ++y) {
    for (int x = 0;x < image.cols; ++x) {
        std::cout<<image.at<double>(y, x)<<" ";
    }
            cout << endl;}

我的输出是一堆像这样的大数字:

-2.98684e+18 -1.21685e-83 -1.91543e-113 -1.8525e-59 -2.73052e-127 -2.08731e-35 -3.72066e-103 ...

关于我错过了什么或做错了什么有什么想法吗?

【问题讨论】:

  • 你确定那是双打吗?
  • image 来自哪里?它是什么数据类型?很可能&lt;double&gt; 只是解释值的错误数据类型。试试image.at&lt;unsigned char&gt;(y,x),或者如果不是灰度图而是BGR,试试image.at&lt;cv::Vec3b&gt;(y,x)
  • 你检查过你的 image.type() 应该是 CV_8U=0 还是 CV_8UC3=16?阅读视频有时会在频道数量方面产生错误。
  • @Micka 我从视频帧中获取图像,然后将其转换为灰度图像,如下所示:Mat frame;Mat image;VideoCapture vid(".../test_file.mp4");vid.read(frame);cvtColor( frame, gray_image, CV_BGR2GRAY );
  • @Vlad 我也尝试过使用cout&lt;&lt;gray_image.at&lt;uchar&gt;(y, x)&lt;&lt;" ";,现在我的输出如下所示:\217 \223 \244 \261 \261 \271 \304 \303 \271 \272...

标签: c++ opencv image-processing


【解决方案1】:

由于您的值 [143、147、164、177...] 看起来像 uchar 类型,因此您的 Mat 类型应该是 CV_8U=0 或 CV_8UC3=16,您可以使用 image.type() 检查。 所以你的输出应该是(正如@Micka 所说)

std::cout<<image.at<uchar>(y, x)<<" "; // gray
or
std::cout<<image.at<Vec3b>(y, x)<<" "; // color

以后只需要使用它就可以不用担心类型了:

Rect rect(0, 0, 10, 10); // print 10x10 block
cout<<image(rect)<<endl;

并不是说知道类型不重要。

【讨论】:

    【解决方案2】:

    如果你想打印图像的所有像素,你可以简单地使用:

    cout << image << endl;
    

    如果要打印像素,请使用:

    cout << image.at<Vec3b>(y, x) << endl; // for color image
    

    cout << (int) image.at<uchar>(y, x) << endl; // for gray-scale image
    

    请注意,在最后一行中,需要将其转换为 int。详情请查看Why "cout" works weird for "unsigned char"?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多