CvMat和Imread Vs IpImage和CvLoadImage

时间:2012-06-20 08:05:13

标签: opencv opencvdotnet

使用OpenCv 2.4

我有两个加载图片的选项:

  1- CvMat and Imread

  2- IpImage and CvLoadImage    

哪一个更好用?我尝试将两者混合并以seg故障结束。

4 个答案:

答案 0 :(得分:14)

imread会返回Mat,而非CvMat。它们是两个不同的接口(Mat / imread用于C ++和Ipl ...和Cv ..用于C接口)。

C ++界面更好,更安全,更易于使用。它会自动为您处理内存,并允许您为同一任务编写更少的代码。 OpenCV人员主张使用C ++,除非一些非常具体的项目要求迫使你使用C语言。

示例(C ++)

cv::Mat image = imread("path/to/myimage.jpg")
if(image.empty())
    return;

cv::imshow("Image", image);

cv::Mat bw = image > 128; // threshold image
cv::Mat crop = image(cv::Rect(0, 0, 100, 100)); // a 100px x 100px crop
crop= 0; // set image to 0

cv::waitKey();
// end code here

请注意,如果没有另行说明,则所有矩阵分配都引用相同的数据。在上面的示例中,crop矩阵指向image,将其设置为零会将image的特定部分设置为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

答案 1 :(得分:0)

IplImage和Mat都是可互换的。

我建议你使用Mat和imread(),因为很容易从Mat获取数据。

Mat :: data返回指向实际矩阵数据的指针,该指针在1D中可以轻松访问。 http://opencv.itseez.com/modules/core/doc/old_basic_structures.html?highlight=mat#union%20data

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

OpenCV的许多实用程序(例如CalcOpticalFlowPyrLK等)都需要Mat。我建议你用Mat。 IplImage现在很老了。

答案 2 :(得分:0)

这取决于你对指针的舒适程度。在IplImage中你可以访问数据

 data[i*widthstep+j*nchannels +k]

其中i,j,k是一些非常简单的整数。在3维的正常矩阵中,它不容易访问数据。对于正常的矩阵数据,访问是针对[i] [j]

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

答案 3 :(得分:0)

来自OpenCV_2食谱:

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

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

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

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

否则,如果您需要释放IplImage结构指向的内存,那么 需要明确地做到: cvReleaseImage(安培; IplImage结构); 请记住,您应该避免使用此弃用数据结构。相反,总是使用 CV ::垫。