Iplimage to List<byte[]>



我正试图将一组iplimage从OpenCV传递给另一个不使用iplimage但使用字节列表[]而是通过c++/cli。任何想法如何添加/转换iplimage到字节[]的列表?

谢谢。

如果您想从iplimage.imageData复制精确的像素,可以使用Marshal.copy以将数据从CCD_ 1(imageData)复制到被管理阵列(byte[])。

但由于imageData是未压缩的,您可能需要使用imencodecvEncodeImage将其压缩到中间缓冲区,然后使用上面的代码将其复制到byte[]

在做其他事情之前,先花点时间了解IplImage是如何创建的,以及它存储了什么样的信息。

然后,请注意,可以通过成员imageData访问图像的像素,该成员是unsigned char*:

IplImage* image = cvLoadImage("starwars.jpg", 0);
int img_sz = image->width * image->height * image->nChannels;
unsigned char* data = (unsigned char*) malloc(img_sz);
memcopy(data, image->imageData, img_sz);

您必须执行类似的过程才能将其转换为byte[]。顺便说一句,这篇文章]2展示了如何将IplImage*转换为IntPtr0。

首先,如果可能的话,我建议您切换到OpenCV的C++API-与旧的C接口相比,它提供了更多的灵活性和功能。

在C++接口中,执行上述任务的代码片段是:

cv::Mat image = cv::imread(imname);
uchar *ptr = (uchar*)image.data

您可以在任何地方使用ptr(一种8位无符号字节数据)——请记住,修改这些数据将修改实际图像。如果您不希望发生这种情况,请使用memcpy复制数据。

如果我理解你的意思,你可以搜索这样的东西:

IplImage* image = cvLoadImage("image.bmp");
std::list<unsigned char*> bytes;
for (int i=0;i<image->height;i++)
 {
   bytes.push_back(image->imageData + image ->widthStep*i);
 }

你可以通过以下操作来测试它是否有效(我在这里访问第二行的第一个像素):

std::list<unsigned char*>::iterator it = bytes.begin();
it++;
*(*it) = 22;
int a = *((unsigned char*)(image->imageData + image->widthStep*1));

对于新的cv::Mat对象,我没有找到这样的方法。您可以将图像转换为std::vectors,但无法将图像转换成std::vector/std::list行。但是,如果您仍然使用cv::Mat类,您可以尝试cv::Ptr<Pixelformat>,它也提供对行指针的访问权限。

最新更新