OpenCV2.3.1调用摄像头(OpenCV2.x版本使用介绍)

转载请注明原文地址:http://blog.csdn.net/huang8579/article/details/8026158


OpenCV2.3.1已经编译完了,上一篇文章中只是简单地介绍一下完全用OpenCV自己图形库实现摄像头调用和图像显示,这篇文章则主要介绍Qt与OpenCV的使用

请注意:

OpenCV 2.x版本和1.x版本有着很大的差别,网上有很多文章讲的都是1.x版本,2.x版本中图像存储容器改为Mat,但是向下兼容以前的容器,库的使用上也有巨大差别

所以以后在使用开源库的时候,首先要去官方网站上查看文档,知道有哪些差别,如果只按照老的文档操作的话, 很容易造成时间上不必要的浪费!!

OpenCV 2.x 文档翻译网站:http://www.opencv.org.cn/opencvdoc/2.3.2/html/index.html

2.X版本的改变

1、新容器

在用新版本之前,你首先需要学习一些新的图像数据结构: Mat - 基本图像容器 ,它取代了旧的 CvMat 和 IplImage.

Mat的基本原理就是矩阵存储,所以在向QImage传递图像数据的大小时,Mat提供了矩阵的行数(Cols)和列数(Rows),用以取代IplImage的宽和高。

2、新的库调用方法

OpenCV 2 接受按需定制。所有函数不再装入一个单一的库中。我们会提供许多模块,每个模块都包含了与其功能相关的数据结构和函数。这样一来,如果你仅仅需要使用OpenCV的一部分功能,你就不需要把整个巨大的OpenCV库都装入你的程序中。使用时,你仅需要包含用到的头文件,比如:

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

所有OpenCV用到的东西都被放入名字空间 cv 中以避免与其他库的数据结构和函数名称的命名冲突。因此,在使用OpenCV库中的任何定义和函数时,你必须在名称之前冠以 cv:: ,或者在包含头文件后,加上以下指令:

using namespace cv;  // 新的C++接口API都在此名字空间中,需要导入。

因为所有库中函数都已在此名字空间中,所以无需加 cv 作为前缀。据此所有新的C++兼容函数都无此前缀,并且遵循驼峰命名准则。也就是第一个字母为小写(除非是单个单词作为函数名,如 Canny)并且后续单词首字母大写(如 copyMakeBorder ).

接下来,请记住你需要将所有用到的模块链接到你的程序中。如果你在Windows下开发且用到了 动态链接库(DLL) ,你还需要将OpenCV对应动态链接库的路径加入程序执行路径中。关于Windows下开发的更多信息请阅读 How to build applications with OpenCV inside the Microsoft Visual Studio;对于Linux用户,可参考 Using OpenCV with Eclipse (plugin CDT) 中的实例及说明。

Qt中使用OpenCV库

新建QWidget工程,ui,main.cpp全都默认

头文件的实现,上面已经介绍,直接代码:

[cpp]  view plain copy
  1. #ifndef WIDGET_H  
  2. #define WIDGET_H  
  3.   
  4. #include <QWidget>  
  5. #include <QPainter>  
  6. #include <QImage>  
  7. #include <QTimer>  
  8. #include <opencv2/highgui/highgui.hpp>  
  9. #include <opencv2/core/core.hpp>  
  10. #include <opencv2/video/video.hpp>  
  11. #include <opencv2/imgproc/imgproc.hpp>  
  12. #define FPS 33  
  13. using namespace cv;  
  14. namespace Ui {  
  15. class Widget;  
  16. }  
  17.   
  18. class Widget : public QWidget  
  19. {  
  20.     Q_OBJECT  
  21.       
  22. public:  
  23.     explicit Widget(QWidget *parent = 0);  
  24.     void paintEvent(QPaintEvent *);  
  25.     ~Widget();  
  26. private:  
  27.     Ui::Widget *ui;  
  28.     VideoCapture V;  
  29.     QTimer timer;  
  30.     Mat im;  
  31. private slots:  
  32.     void showImage();  
  33. };  
  34.   
  35. #endif // WIDGET_H  

定时器的使用,不介绍了,相信看代码能看懂, 讲一下VideoCapture,这个比以前的cvCreateCamera方便许多,不需要在把每一帧图像存到队列里以后再传给容器了,可以直接用 V >> im来实现,打开摄像头方式和以前相同

[cpp]  view plain copy
  1. //数字代表设备号,就是调用哪个摄像头  
  2. VideoCapture V(0);  
  3. //指针方式  
  4. V = new VideoCapture(0);  
  5. //判断是否成功打开摄像头  
  6. V.isOpened()  
构造函数实现:

[cpp]  view plain copy
  1. Widget::Widget(QWidget *parent) :  
  2.     QWidget(parent),  
  3.     ui(new Ui::Widget)  
  4. {  
  5.     ui->setupUi(this);  
  6.     V.open(0);  
  7.     //设定摄像头采集图像的宽、高,可以不设置,采用原始图像  
  8.     V.set(CV_CAP_PROP_FRAME_WIDTH,);  
  9.     V.set(CV_CAP_PROP_FRAME_HEIGHT,450);  
  10.     //开启定时器  
  11.     timer.start(FPS);  
  12.     //img = new QImage((unsigned char*)im.data,im.cols,im.rows,QImage::Format_RGB888);  
  13.     connect(&timer,SIGNAL(timeout()),this,SLOT(showImage()));  
  14. }  
OpenCV的图像格式是BGR,QImage的则是RGB,所以要进行图像格式转换,否则图像会的颜色会走样,2.x版本里面用cvtColor进行转换,详情见代码:

[cpp]  view plain copy
  1. void Widget::showImage()  
  2. {  
  3.   
  4.     V >> im;  
  5.     //图像格式转换  
  6.     cvtColor(im,im,CV_BGR2RGB);  
  7.     update();  
  8. }  

最后在QWidget上用QPainter进行绘图,Qt有很多可绘图控件,比如Qlabel、QWidget等,这些控件自身带有绘图事件的触发,通过调用控件的update(),可以触发绘图事件,对控件进行重新绘图,用这种控件自身的绘图功能效率上远远高于其他额外的绘图方式

注意QImage接收Mat图像数据时传递的参数类型

绘图部分代码:

[cpp]  view plain copy
  1. void Widget::paintEvent(QPaintEvent *)  
  2. {  
  3.     QImage img((unsigned char*)im.data,im.cols,im.rows,QImage::Format_RGB888);  
  4.     QPainter painter(this);  
  5.     painter.drawImage(-1,-1,img);  
  6. }  

关于QPainter的内容,大家自己在网上找吧,很多了,我就不介绍了,直接看Qt文档也行

有什么不足的地方,还请提出来,大家一起进步!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值