并与CvMat Vs的Imread和IpImage CvLoadImage(CvMat and Im

2019-07-30 01:31发布

使用opencv 2.4

我有两个选择加载图片:

  1- CvMat and Imread

  2- IpImage and CvLoadImage    

哪一个是更好地使用? 我试图将两者混合,并在赛格故障结束。

Answer 1:

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。

要创建一个新的数据副本,使用垫:: CopyTo从,或垫::克隆();

而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


Answer 2:

IplImage结构和Mat都是相互转换。

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

垫::数据指针返回到实际的矩阵数据,其在一维和的值是很方便。 http://opencv.itseez.com/modules/core/doc/old_basic_structures.html?highlight=mat#union%20data

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

许多的OpenCV的工具(如CalcOpticalFlowPyrLK等)的需要垫。 我会建议你使用垫。 IplImage的是老东西了。



Answer 3:

这取决于你是多么舒服pointers.In的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


Answer 4:

从OpenCV_2食谱:

这种结构是由IPL库(即英特尔的图像处理库),现在用IPP库(英特尔集成性能基元库)集成继承。 如果您使用的代码和用旧的C界面创建库,你可能需要操作者的IplImage结构。 幸运的是,一个是IplImage转换成CV ::垫目标的便捷方式。

的IplImage *的IplImage = cvLoadImage( “C:\ img.jpg”); CV ::垫图像4(IplImage结构,假);

功能cvLoadImage是C接口函数加载图像。 在CV ::垫对象的构造函数的第二个参数表明数据将不会被复制(将其设置为true,如果你想有一个新的副本,而假的是默认值,因此可以省略),既IplImage结构和图像4将共享相同的图像数据。 你必须要小心,这里不会产生悬摆指针。 出于这个原因,它是安全的的IplImage指针封装成由OpenCV中2所提供的引用计数指针类:

CV :: PTR的IplImage = cvLoadImage( “C:\ img.jpg”);

否则,如果您需要解除分配内存您的IplImage结构指出,你需要明确地做到这一点:cvReleaseImage(IplImage的); 请记住,你应该避免使用此弃用的数据结构。 相反,总是使用CV ::垫。



文章来源: CvMat and Imread Vs IpImage and CvLoadImage