嵌入OpenCV图像

时间:2016-04-29 14:08:09

标签: c++ opencv

这可能看起来很奇怪,但我想在我的源代码中嵌入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源代码中嵌入图像的最佳方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

嗯,问题是您是直接使用数字来模仿opencv加载的图像。这意味着您手动调整步长,大小和类型,而不知道它们的含义。

默认情况下,OpenCV会在RGB颜色空间中打开图像(但会将其加载为BGR)。这表示为CV_8UC3 - &gt;类型的矩阵。 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之一值。你在某个地方有一些额外的价值......根据你的评论判断,我认为在开始时。