垫子类型转换和访问单个像素的问题

Posted

技术标签:

【中文标题】垫子类型转换和访问单个像素的问题【英文标题】:Trouble with mat type conversion and accessing individual pixel 【发布时间】:2013-11-11 15:04:51 【问题描述】:

我在使用 OpenCV 编程时遇到了麻烦。 看了很久才发现,cout

这是代码

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;

int main() 
Mat a = (Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
cout << "Initial mat type: " << a.type() << endl;
cout << "Pos(1, 1): " << a.at<int>(1, 1) << endl;

a.convertTo(a, CV_8U);
cout << "CV_8U converted mat type: " << a.type() << endl;
cout << "Mat content: \n" << a << endl;
cout << "Pos(1, 1): " << a.at<int>(1, 1) << endl;

return 0;

结果在这里:

Initial mat type: 4 // CV_32S 
Pos(1, 1): 5
CV_8U converted mat type: 0 // CV_8U
Mat content: 
[1, 2, 3;
  4, 5, 6;
  7, 8, 9]
Pos(1, 1): -1254749944

这意味着,从 CV_32S 转换为 CV_8U 后,我从 cout 你能帮助我吗?谢谢!

【问题讨论】:

【参考方案1】:

由于您已将值转换为不同的类型,因此您需要使用不同的类型来访问它们:

cout << "Pos(1, 1): " << static_cast<int>(a.at<uchar>(1, 1)) << endl;

【讨论】:

当使用cout 时,您可能希望向 int 添加显式强制转换。 cout &lt;&lt; char(5) 可能无法提供预期结果 cout (1, 1)

以上是关于垫子类型转换和访问单个像素的问题的主要内容,如果未能解决你的问题,请参考以下文章

将符合多个协议的类型转换为单个协议

Scala 学习笔记之隐式参数和隐式转换并用

单个查询的临时数据类型转换

在逻辑上表示单个值时将类转换为结构,类似于原始类型

在不将单个像素值转换为浮点数的情况下调整目标分割图的大小

将 Pandas Dataframe 转换为 Parquet 失败:列表子类型字符串溢出单个块的容量