为什么OpenCV返回像素强度的奇怪值

Why OpenCV return strange value for pixel intensity?

本文关键字:OpenCV 返回 像素 为什么      更新时间:2023-10-16

我已经使用C 和OpenCV 3.1,我用这些代码将RGB分开:

Mat src = imread("original_image.jpg",CV_LOAD_IMAGE_COLOR);
Mat bgr[3] , bluemat ;
split(src,bgr);
bluemat = bgr[0];
std::cout << "bluemat.at<int>(0,1); : " << bluemat.at<int>(0,1) << 'n';

奇怪的是,它打印出一个大数字: 1415208581 ,为什么是?

难道不是在0-255范围内吗?为什么不是?

(扩展搜索评论(

a opencv的功能cv::Mat图像类型是一个非常简单的对象,基于库的原始C版本。

cv::Mat包含一个提供像素类型的字段,但数据仅作为内存字节的块存储。您可以使用此内存块来存储和访问像素,并可以根据需要进行访问。它使其非常灵活且易于与其他库链接,但意味着您需要手动跟踪数据是什么。

因此,data.at<int>(0,0)会提取第一个像素,就好像数据是ints(您的平台上的INT(一样,data.at<uchar> (0,0)将将第一个像素作为字节(通常是您想要的(。

这里的主要区别是将内存字节投入到uchar vs int。您所拥有的数据的哪种形式取决于您如何读取它。CV_LOAD_IMAGE_COLOR将图像读为16位/32位值。我无法编译您给我的代码,因为将数据转换为int所创建的内存问题。

现在,如果您使用uchar,则将解决。但是,cout打印字符的问题与<<

的过载功能有关
Mat src = imread("1.jpg", CV_LOAD_IMAGE_COLOR);
Mat bgr[3], bluemat;
split(src, bgr);
bluemat = bgr[0];
std::cout << "bluemat.at<uchar>(0,1); : " << (int)bluemat.at<uchar>(0, 1) << 'n';

我更改的只是插入Typecast int。此问题在这里扩展,但告诉输出流是一个数字,而不是字符。