OpenCV输出奇数像素值

时间:2014-03-21 21:47:01

标签: c++ opencv image-processing

我想用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 ...

关于我遗失或做错的任何想法?

2 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:0)

如果要打印图像的所有像素,只需使用:

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"?