CvMat和Imread Vs IpImage和CvLoadImage

gpu*_*guy 8 opencv opencvdotnet

使用OpenCv 2.4

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

  1- CvMat and Imread

  2- IpImage and CvLoadImage    
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*Sam 14

imread返回a 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
Run Code Online (Sandbox Code Playgroud)

注意,如果没有另外说明,则所有矩阵分配都引用相同的数据.在上面的示例中,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
Run Code Online (Sandbox Code Playgroud)