opencv之基础篇(关于Mat类的使用)

*opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高。而CvMat和IplImage类型更侧重于“图像”。在opencv2.0之前,opencv是完全用C实现的,但是,IplImage类型与CvMat类型的关系类似于面向对象中的继承关系。实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见。使用这两个结构的问题是内存需要手动管理,开发者必须清楚的知道何时需要申请内存,何时需要释放内存,因此在新版本的 OpenCV 中引入了能自动管理内存的Mat 类。
Mat是一个优秀的图像类,也是一个优秀的矩阵类。

打开摄像头/读取视频

VideoCapture可以从视频文件中读取图像也可以从摄像头中读取图像
VideoCapture(0)打开固定的摄像头,VideoCapture(-1)是打开随机的摄像头,VideoCapture(**.avi)是打开视频文件。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
//   VideoCapture capture(0);//打开摄像头
   VideoCapture capture("qc.avi");//打开视频
   if (!capture.isOpened())//检验是否打开
       return -1;
   Mat frame;
   while (1)
   {
       capture >> frame;
       imshow("show video",frame);
       waitKey(30);
   }
   return 0;
}

Mat转换为IplImage 和CvMat

cv::Mat img;    
CvMat cvMatImg = img;   
IplImage IplImg = img; 

ps:需要特别注意的是,类型转换后,IplImage 和 CvMat 与 Mat 共用同一矩阵数据,而IplImage 和 CvMat 没有引用计数功能,如果上例中的 img 中数据被释放, iplimg 和 cvimg 也就失去了数据。因此要牢记不可将 Mat 对象提前释放。

IplImage 和CvMat转换为Mat

IplImage *IplImg = cvLoadImage("fruits.jpg");  
Mat img(IplImg, true);

Mat 类有两个构造函数,可以实现 IplImage 和 CvMat 到 Mat 的转换。这两个函数都有一个参数copyData。如果copyData的值是false,那么Mat将与IplImage或CvMat 共用同一矩阵数据;如果值是 true,Mat 会新申请内存,然后将 IplImage或CvMat 的数据复制到 Mat 的数据区。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值