我想用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 ...
任何想法,我错过了什么或做错了?
因为你的值[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;
并不是说知道类型不重要。
如果您想打印图像的所有像素,您可以简单地使用:
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
。有关详细信息,请查看为什么"cout"对"unsigned char"工作奇怪?