Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv i要列出的限制<;字节[]>;_Opencv_C++ Cli - Fatal编程技术网

Opencv i要列出的限制<;字节[]>;

Opencv i要列出的限制<;字节[]>;,opencv,c++-cli,Opencv,C++ Cli,我正在尝试将一组iplimage从OpenCV传递到另一个不使用iplimage但使用 字节[]的列表 而是通过c++/cli。 知道如何将iplimage添加/转换到 字节[]的列表 谢谢。如果要从iplimage.imageData复制精确的像素,可以使用 将数据从IntPtr(imageData)复制到托管阵列(字节[]) 但是由于imageData是未压缩的,您可能希望使用imencode或将其压缩到中间缓冲区,然后使用上述代码将其复制到字节[]。在执行任何其他操作之前,请花些时间了解它

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


谢谢。

如果要从iplimage.imageData复制精确的像素,可以使用 将数据从
IntPtr
(imageData)复制到托管阵列(字节[])


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

在执行任何其他操作之前,请花些时间了解它存储的信息类型

然后,请注意,可以通过成员
imageData
访问图像的像素,该成员是
无符号字符*

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);

您必须执行类似的过程才能将其转换为
字节[]
。顺便说一下,这篇文章展示了如何将<代码> iPLIMAGI**/COD>转换成<代码> SDLYSurvie*/Cux>

< P>首先,我建议您切换到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);
 }
IplImage*image=cvLoadImage(“image.bmp”);
std::列表字节;
for(int i=0;iheight;i++)
{
字节。向后推(图像->图像数据+图像->宽度步长*i);
}
您可以通过执行以下操作来测试它是否有效(我在这里访问第二行的第一个像素):

std::list::iterator it=bytes.begin();
it++;
*(*it)=22;
int a=*((无符号字符*)(图像->图像数据+图像->宽度步长*1));
我没有找到使用新的cv::Mat对象执行类似操作的方法。可以将图像转换为std::vectors,但无法将图像转换为行std::vector/std::list。
但是如果您仍然使用cv::Mat类,您可以尝试使用
cv::Ptr
,该类还提供对行指针的访问。

您想存储压缩图像(jpg)还是未压缩位图表示(imageData)?我想存储Iplimage数据。这不是答案。
lplimage
是指向从像素
(0,0)
开始的未打包图像数据的指针,还是指向内存中可能被压缩、包含文件头等的整个图像的指针?两者非常不同。我使用cvQueryframe从Avi视频捕获一帧,该帧保存到Iplimage指针。我假设捕获的帧是压缩图像,但我不是sure@bestnagiiplImage中没有未压缩的图像。为什么要复制数据而不是使用直接访问?(当有很多图像时可能需要很长时间)上面的示例只是演示如何使用IplImage复制像素并创建新图像;数组^hh1=gcnew数组(img_sz1);Marshal::Copy((IntPtr)img->imageData,hh1,0,img_sz1);而且它起作用了。我添加了编码步骤CvMat*buf=cvEncodeImage(“.jpeg”,img1,jpeg_参数);img_sz1=buf->width*buf->height Marshal::Copy((IntPtr)buf,hh1,0,img_sz1);现在它在marshal:copy行给出了一个错误,mscorlib.dll中发生了类型为“System.AccessViolationException”的未处理异常。其他信息:尝试读取或写入受保护的内存。第一种方法部分正确
image_sz1
应为
img1->高度*img1->宽度步长
。第二种方法是复制
cvMat
,而不是它的数据
buf->ptr
(我猜)。更正这两个错误,如果仍然不起作用,请立即通知我。
std::list<unsigned char*>::iterator it = bytes.begin();
it++;
*(*it) = 22;
int a = *((unsigned char*)(image->imageData + image->widthStep*1));