嵌入OpenCV图像
Embed an OpenCV Image
这可能看起来很奇怪,但我想在我的源代码中嵌入一个PGM图像。
我试图创建一个字节数组,但当我使用与原始文件中相同的参数显示它时,图像似乎已损坏。当然,原件是可以的。
这就是我尝试过的:
unsigned char s1_1_pgm[10318] = {
0x50, 0x35, 0x0a, //...
};
cv::Mat n(cv::imread("1.pgm"));
cv::Mat m(cv::Size(92, 112), 16, s1_1_pgm, 276);
std::cout << "CHR " << m.empty() << " type " << m.type() << " step " << m.step << " size " << m.size().width << " x " << m.size().height << std::endl;
std::cout << "PGM " << n.empty() << " type " << n.type() << " step " << n.step << " size " << n.size().width << " x " << n.size().height << std::endl;
imshow("hello", m);
cv::waitKey(0);
输出显然是这样的:
CHR 0 type 16 step 276 size 92 x 112
PGM 0 type 16 step 276 size 92 x 112
我对OpenCV完全陌生,所以我可能做了一些非常愚蠢的事情。
在OpenCV源代码中嵌入图像的最佳方式是什么?
谢谢!
问题是,您直接使用数字来模拟opencv加载的图像。这意味着您手动设置步长、大小和类型,而不知道它们的含义。
默认情况下,OpenCV在RGB
颜色空间中打开图像(但将其加载为BGR
)。这表示为CV_8UC3
->C3类型的矩阵是3个通道,8U是无符号字符(8位大小)。
276对于这种情况是正确的,在这种情况下您有3个通道,但对于灰度图像则不正确。276是步长,如何得到这个数字,简单:
int size = 1;
// use any way to get the size of the type used, either
// manually or maybe sizeof function.
int cols = 92;
int channels = 1;
int step = cols * size * channels;
如果是彩色图像,或者BGR颜色空间中至少有一个,则需要276(92 x 1 x 3)的步长。此外,阵列将按以下方式组织:
B_1 G_1 R_1 B_2 G_2 R_2 .... B_n G_n R_n
这意味着每个像素需要数组的3个空格(3个uchar值),如果你有灰度级的数据,那么需要3个值才能显示一个像素,这在人眼看来就像垃圾:)
要解决这个问题,只需更改
cv::Mat m(cv::Size(92, 112), 16, s1_1_pgm, 276);
至:
cv::Mat m(cv::Size(92, 112), CV_8U, s1_1_pgm, 92);
还有另一个问题。。。。你的数据大小不对。。。对于灰度级为92列112行的图像,您需要10304个值的uchar数组,但您使用的是10318个值中的一个。你在某个地方有一些额外的价值。。。。从你的评论来看,我认为这是一开始。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如果不在窗口 10 中声明名为 openCV 的 openCV namedWindow,QT 图像显示将无法正常工作
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- 如何在 OpenCV 中将图像与另一个图像相关联
- 如何在 OpenCV c++ 中压缩 TIFF 格式的图像?
- OpenCV - 如何在灰度图像上应用 Kmeans?
- 阅读和处理图像(OpenCV/C )
- cv::findContours 正在修改源图像 OpenCV 2.3
- 将图像替换为更大尺寸的图像 (OpenCV)
- 显示像素值已更改的图像openCV
- 具有积分图像的快速模糊图像(OpenCV)
- 扫描图像OpenCV上的文档检测
- 使用cv::Mat图像(opencv)如何检测对象
- 写作和展示图像OpenCV
- 从文件夹中读取图像(OpenCV)
- 无法保存从网络摄像头捕获的图像(OpenCV 2.3 的 imwrite 编译错误)
- 旋转不变的多个模板出现在图像Opencv