使用 OpenCv 2.4
我有两个加载图像的选项:
1- CvMat and Imread
2- IpImage and CvLoadImage
哪个更好用?我尝试将两者混合并最终陷入段错误。
最佳答案
imread
返回一个 Mat
,而不是 CvMat
。它们是两个不同的接口(interface)(Mat
/imread
用于 C++ 和 Ipl... 以及 Cv.. 用于 C 接口(interface))。
C++ 接口(interface)更好、更安全且更易于使用。它会自动为您处理内存,并允许您为同一任务编写更少的代码。 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接口(interface)
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
关于.net - CvMat 和 Imread 与 IpImage 和 CvLoadImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11115272/