opencv中读取图像的函数有两种方式:
1、Mat Imread;
2、IplImage CvLoadImage;
如何选择呢,先看一下两者的区别吧!
首先,Mat Imread用于C++接口,IplImage CvLoadImage用于C接口,需要说明的是C++接口会自动分配和释放内存,所以一般大家会选择前者,除非一些特殊的工程中要求用c接口。
然后,imread的定义在highgui.hpp中,cvloadimage的定义在highgui-c.h中,而highgui.hpp和highgui-c.h都包含在highgui.h中,所以我们在写程序是只要包含了highgui.h,那么我们就可以用两个接口。
先看一个例子:()
void main()
{
cv::Mat img = cv::imread("D:\\图片资料\\good\\10.jpg");
if(img.empty())
return;
cv::imshow ("image",img);
cv::Mat bw=img>128;//阈值二值话
cv::Mat crop=img(cv::Rect (0,0,100,100));//裁切
crop=0;//设置裁切图片为0
cv::imshow ("crop",crop);
cv::waitKey (100);
//return(0);
}
请注意,如果没有另外说明,所有的矩阵赋值引用的都是相同的数据。另外,在上述的例子中,对img修剪并将其设为0,这将设置的图象的特定部分为0。
如果想create a new copy of data,使用Mat::copyTo或者Mat::clone().
void main()
{
cv::Mat img = cv::imread("D:\\图片资料\\xx.jpg");
if(img.empty())
return;
cv::Mat bw=img>128;//阈值二值话
Mat Img=img.clone();
Mat G;
Img.copyTo (G);//此处注意要先声明一个对象然后再对对象copy
cv::imshow ("image",Img);
cv::Mat crop=img(cv::Rect (0,0,100,100));//裁切
crop=0;//设置裁切图片为0
cv::imshow ("crop",crop);
cv::waitKey (100);
//return(0);
}
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.
作为初学者且跨专业的我及其他小伙伴们:
#include "opencv2/opencv.hpp"
#include "cxcore.hpp"
#include "cv.h"
#include "highgui.h"
添加这些头文件就可以opencv的基本操作了,
using namespace cv;如果有这句话就可以直接Mat操作而不用cv::Mat。