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 CvMat和Imread与IpImage和CvLoadImage的对比_Opencv_Opencvdotnet - Fatal编程技术网

Opencv CvMat和Imread与IpImage和CvLoadImage的对比

Opencv CvMat和Imread与IpImage和CvLoadImage的对比,opencv,opencvdotnet,Opencv,Opencvdotnet,使用OpenCv 2.4 我有两个选项可以加载图像: 1- CvMat and Imread 2- IpImage and CvLoadImage 哪一个更好用?我试着把这两者混合在一起,结果陷入了seg故障 imread返回一个Mat,而不是CvMat。它们是两个不同的接口( Mat > />代码> IcRead C++和IPL……和C……C接口)。p> < C++界面更友好、更安全、更容易使用。它自动为您处理内存,并允许您为同一任务编写更少的代码。OpenCV的人主张

使用OpenCv 2.4

我有两个选项可以加载图像:

  1- CvMat and Imread

  2- IpImage and CvLoadImage    

哪一个更好用?我试着把这两者混合在一起,结果陷入了seg故障

imread
返回一个
Mat
,而不是
CvMat
。它们是两个不同的接口(<代码> Mat <代码> > />代码> IcRead <代码> C++和IPL……和C……C接口)。p> < C++界面更友好、更安全、更容易使用。它自动为您处理内存,并允许您为同一任务编写更少的代码。OpenCV的人主张使用C++,除非一些非常具体的项目要求迫使你去C. < /P> 示例(C++)

请注意,如果没有另外说明,所有矩阵赋值都引用相同的数据。在上面的示例中,
裁剪
矩阵指向
图像
,将其设置为零将
图像的特定部分设置为0

要创建数据的新副本,请使用Mat::copyTo或Mat::clone()

和C接口

IplImage* pImg = CvLoadImage("path/to/myimage.jpg");
if(pImg == NULL)
    return;

// ... big bloat to do the same operations with IplImage    

CvShowImage("Image", pImg);
cvWaitKey();
CvReleaseImage(&pImg); // Do not forget to release memory.
// end code here

IplImage和Mat都是可转换的

我建议您使用Mat和imread(),因为从Mat获取数据非常容易

Mat::data返回一个指向实际矩阵数据的指针,该指针位于1D中,其值易于访问

如果您想在OpenCV中为各种跟踪算法(例如OpenTLD)添加机器学习概念,可以使用Mat.data轻松访问数据,以获取指向实际矩阵的指针


OpenCV的许多实用程序(如CalcOpticalFlowPyrLK等)都需要Mat。我建议你用垫子。IplImage现在已经过时了。

这取决于您对指针的熟悉程度。在IplImage中,您可以通过以下方式访问数据:

 data[i*widthstep+j*nchannels +k]
其中i,j,k是一些整数,这是一个非常容易的方法。在三维的正规矩阵中,数据的存取并不容易。对于标准矩阵,数据访问是针对[i][j]

  *(*(a + i) + j) is the value of jth element of ith row in matrix a

从OpenCV_2食谱:

此结构是从IPL库继承的 (即英特尔图像处理库)现已与IPP库(英特尔 集成性能原语库)。如果使用使用创建的代码和库 在旧的C接口中,您可能需要操作那些IplImage结构。幸运的是, 有一种方便的方法可以将IplImage转换为cv::Mat对象

IplImage*IplImage=cvLoadImage(“c:\img.jpg”); cv::Mat image4(iplImage,假)

函数cvLoadImage是用于加载图像的C接口函数。第二个参数 在cv::Mat对象的构造函数中,表示不会复制数据(将其设置为 如果需要新副本,则为true,而false是默认值,因此可以忽略它), 也就是说,IplImage和image4将共享相同的图像数据。你需要小心 这里不创建悬空指针。因此,封装IplImage更安全 指向OpenCV 2提供的引用计数指针类的指针:

cv::Ptr iplImage=cvLoadImage(“c:\img.jpg”)

否则,如果需要释放IplImage结构所指向的内存,则 需要明确地做到这一点: cvReleaseImage(&iplImage); 请记住,您应该避免使用这种不推荐的数据结构。相反,始终使用 cv::垫

  *(*(a + i) + j) is the value of jth element of ith row in matrix a