我试图将一组iplimage从OpenCV传递到另一个不使用iplimage但使用的程序(.net) 字节列表[] 而是通过c ++ / cli。 知道如何添加/转换iplimage到 byte []?
列表感谢。
答案 0 :(得分:0)
如果要从iplimage.imageData复制精确像素,可以使用Marshal.Copy
将数据从IntPtr
(imageData)复制到托管数组(byte [])。
但是由于imageData是未压缩的,您可能希望使用imencode
或cvEncodeImage
将其压缩到中间缓冲区,然后使用上面的代码将其复制到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>
,它也可以访问行指针。