使用opencv 2.4
我有两个选择加载图片:
1- CvMat and Imread
2- IpImage and CvLoadImage
哪一个是更好地使用? 我试图将两者混合,并在赛格故障结束。
使用opencv 2.4
我有两个选择加载图片:
1- CvMat and Imread
2- IpImage and CvLoadImage
哪一个是更好地使用? 我试图将两者混合,并在赛格故障结束。
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
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的是老东西了。
这取决于你是多么舒服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
从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 ::垫。