c++ - 从 IplImage 转换为 Mat 且 cvarrToMat 缺少/跳过图像数据字节
问题描述
我正在尝试将容器 IplImage 中的图像转换为 Mat 对象,而不是使用cvarrToMat
我意识到转换后的 Mat 图像最后会显示一些随机数据字节(也就是内存中的一些未初始化字节),但我不明白为什么会发生这种情况和/或如何解决这个问题?请参阅下面的代码和结果。
我正在使用 opencv 2.4.13.7 并在 Visual Studio 2017 (Visual C++ 2017) 中工作
我生成了一个具有像素可识别数据的数据数组,其中包含 3*4 分辨率图像的数据,深度为 8 位和 3 个颜色通道。当打印来自转换图像的数据时,它显示它在数据的每一行末尾跳过一个像素(3 个字节)。
#include "pch.h"
#include <iostream>
#include "cv.hpp"
#include "highgui.hpp"
using namespace std;
using namespace cv;
int main()
{
IplImage* ipl = NULL;
const char* windowName = "Mat image";
int i = 0;
ipl = cvCreateImage(cvSize(3, 4), IPL_DEPTH_8U, 3);
char array[3* 4 * 3] = { 11,12,13, 21,22,23, 31,32,33, 41,42,43, 51, 52, 53, 61, 62, 63, 71, 72, 73, 81, 82, 83, 91, 92, 93, 101, 102, 103, 111, 112, 113, 121, 122, 123 };
ipl->imageData = array;
printf("ipl->imageData = [ ");
for (i = 0; i < (ipl->width*ipl->height*ipl->nChannels); i++) {
printf("%u, ", ipl->imageData[i]);
}
printf("]\n\n");
Mat ipl2 = cvarrToMat(ipl);
cout << "ipl2 = " << endl << " " << ipl2 << endl << endl;
//display dummy image in window to use waitKey function
Mat M(3, 3, CV_8UC3, Scalar(0, 0, 255));
namedWindow(windowName, CV_WINDOW_AUTOSIZE);
imshow(windowName, M);
waitKey(0);
cvReleaseImage(&ipl);
}
如果仅对 2*2 像素分辨率的图像执行相同操作,则在行尾仅跳过两个字节。我也无法解释。
我想进行这种转换的原因是因为我在 C 中有一个工作例程,将图像数据从文件(关于带有原始图像数据的旧图像文件格式的长篇故事)导入 IplImage 以进行进一步处理,我想暂时保留 - 但我想开始将图像作为 Mat 处理,因为这似乎得到了更广泛的支持并且通常更易于使用,至少在我看到这个之前是这样。
解决方案
免责声明:这不是问题本身的答案,但应该有助于作者进一步调查他的问题。另外,请参阅问题下方的评论。
作为一个小测试,我使用这个 3x3 图像(你几乎看不到 - 看看我的链接问题的“原始”输入):
在Image Watch(Visual Studio 扩展)中,它看起来像这样:
让我们试试下面的代码:
// Read input image.
cv::Mat img = cv::imread("test.png", cv::IMREAD_COLOR);
// Output pixel values.
for (int x = 0; x < img.cols; x++)
{
for (int y = 0; y < img.rows; y++)
{
printf("%d ", img.at<cv::Vec3b>(y, x)[0]);
printf("%d ", img.at<cv::Vec3b>(y, x)[1]);
printf("%d \n", img.at<cv::Vec3b>(y, x)[2]);
}
}
我们会得到这个输出:
0 255 255
0 255 255
255 255 255
255 0 255
255 255 255
255 0 255
0 0 255
0 255 255
255 0 255
现在,您可以使用嵌套循环来检查图像数据(或更好:像素值)在您的IplImage ipl
和您的Mat ipl2
.
推荐阅读
- c# - 在不使用主页面的情况下在详细信息页面中导航
- import - SAS Proc Import“Table”:“Table”参数是必需的参数吗?
- jquery - Ajax 请求后选择选项未重置
- matlab - Matlab if else循环
- php - 使用 Wordpress 为 ShareTribe 的托管版本创建页面
- android - 在 Kivy 中绑定 'esc' 并在 kv 文件中完成屏幕管理
- javascript - 在创建诸如仓位之类的递增值时如何消除可变性?
- haskell - Reddit API 收到评论
- python-3.x - 文本分隔符在数据框中移动值
- javascript - 通过单击按钮重置使用 css 创建的动画