c++ - 嵌入 OpenCV 图像

标签 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 源代码中嵌入图像的最佳方式是什么?

谢谢!

最佳答案

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

OpenCV 默认情况下会在 RGB 色彩空间中打开图像(但将其加载为 BGR)。这表示为 CV_8UC3 类型的矩阵 -> C3 是 3 个 channel ,8U 是无符号字符(8 位大小)。

276 对于这种情况是正确的,因为您有 3 个 channel ,但对于灰度图像则不正确。 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 个值之一值(value)观。你在某处有一些额外的值(value)......从你的评论来看,我认为在一开始。

关于c++ - 嵌入 OpenCV 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36940505/

相关文章:

C++ - 确定Linux中是否存在目录(不是文件)

C++0x 指定初始化器

c++ - 使用 C++ 构建它时出现 Opencv 错误

c++ - 如何从 CV_8UC4 矩阵中获取值

opencv - OpenCV来自对象的独特计数

python - 如何在带有opencv4的Google colab中使用SIFT和SURF算法?

opencv - HomographyBasedEstimator 和 findHomography OpenCV 之间的区别

c++ - 访问结构体数组的元素。

c++ - 创建一个新的 Cocos2d-x 项目超过 200mb!如何创建更简单的模板?

c++ - 异常和复制构造函数 : C++