我正试图将一组iplimage从OpenCV传递给另一个不使用iplimage但使用字节列表[]而是通过c++/cli。任何想法如何添加/转换iplimage到字节[]的列表?
谢谢。
如果您想从iplimage.imageData复制精确的像素,可以使用Marshal.copy以将数据从CCD_ 1(imageData)复制到被管理阵列(byte[])。
但由于imageData是未压缩的,您可能需要使用imencode
或cvEncodeImage
将其压缩到中间缓冲区,然后使用上面的代码将其复制到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*
转换为IntPtr
0。
首先,如果可能的话,我建议您切换到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>
,它也提供对行指针的访问权限。