Iplimage to List <byte []> </byte []>

时间:2012-07-09 18:03:24

标签: opencv c++-cli

我试图将一组iplimage从OpenCV传递到另一个不使用iplimage但使用的程序(.net)     字节列表[] 而是通过c ++ / cli。 知道如何添加/转换iplimage到     byte []?

列表

感谢。

4 个答案:

答案 0 :(得分:0)

如果要从iplimage.imageData复制精确像素,可以使用Marshal.Copy 将数据从IntPtr(imageData)复制到托管数组(byte [])。

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

答案 1 :(得分:0)

在做其他事情之前,请花时间学习how an IplImage is created,以及它存储的信息类型。

然后,请注意图像的像素可以通过成员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*转换为SDL_Surface*

答案 2 :(得分:0)

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

在C ++界面中,执行上述任务的代码段为:

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

您可以在任何地方使用您的ptr(8位无符号字节数据) - 请记住修改此数据将修改实际图像。如果您不希望发生这种情况,请使用memcpy获取数据的副本。

答案 3 :(得分:0)

如果我理解你,你会搜索这样的东西:

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>,它也可以访问行指针。