使用OpenCv 2.4
我有两个加载图片的选项:
1- CvMat and Imread
2- IpImage and CvLoadImage
哪一个更好用?我尝试将两者混合并以seg故障结束。
答案 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 ::垫。