《OpenCV》Part2 OpenCV3.1.0调用摄像头显示视频并拍照
1、首先要贴出cv3.0后的控制台程序
code:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/ml/ml.hpp"
using namespace std;
using namespace cv;
int main(int argc,char *argv[])
{
int cameraNumber=0;
if (argc>1)
cameraNumber =atoi(argv[1]);
VideoCapture camera;
camera.open (cameraNumber );
if (!camera .isOpened ())
{
cerr<<"ERROPR"<<endl;
exit(1);
}
while(true)
{
Mat cameraFrame;
camera >>cameraFrame ;
if (cameraFrame .empty ())
{
cerr<<"ERROR1"<<endl;
exit(1);
}
imshow("woqu",cameraFrame );
char key=cv::waitKey (1000);
if (key==27)
{
break;
}
}
}
整合到Qt5.5.0中,具体的代码如下:
code:
getCamera.h
#ifndef GETCAMERA_H
#define GETCAMERA_H
#include <QtWidgets/QMainWindow>
#include "ui_getcamera.h"
#include <QtWidgets/QDialog>
//#include <opencv2/core/core.hpp>
#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>//for camera
#include <QtCore/QTimer>
#include <QtGui/QPixmap>
#include <QtGui/QImage>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/ml/ml.hpp"
class getCamera : public QMainWindow
{
Q_OBJECT
public:
getCamera(QWidget *parent = 0);
~getCamera();
private:
Ui::getCameraClass ui;
cv::VideoCapture cam;
cv::Mat frame;
QTimer *timer;
private slots:
void openCamera();//开摄像头
void readFrame();//读取当前帧信息
void closeCamera();//关摄像头
void takingPictures();//拍照
};
#endif // GETCAMERA_H
getCamera.cpp
#include "getcamera.h"
getCamera::getCamera(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//构造函数
cam = NULL;
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()),this,SLOT(readFrame()));
connect(ui.openCam, SIGNAL(clicked()), this, SLOT(openCamera()));
connect(ui.takePic, SIGNAL(clicked()), this, SLOT(takingPictures()));
connect(ui.closeCam, SIGNAL(clicked()), this, SLOT(closeCamera()));
}
getCamera::~getCamera()
{
}
void
getCamera::openCamera(){
cam.open(0);
timer->start(33);
注释后面的是openCV3.0以前的版本,可以参考
//cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头获取视频,cvCaptureFromCAM其实是一个宏,就是cvCreateCameraCapture的别名,0代表第一个摄像头。-1代表默认摄像头。
//timer->start(330);//开始计时,超时则发出timeout()警告
}
void
getCamera::readFrame(){
cam >> frame;
QImage img1 = QImage((const unsigned char*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();//个人测试时可以试试去掉.rgbSwapped()后的效果
ui.label->setPixmap(QPixmap::fromImage(img1));
///
//frame = cvQueryFrame(cam);//从摄像头中抓取并返回每一帧
将抓取的帧,转换为QImage格式。QImage::Format_RGB888不同摄像头使用的格式不同
//
//QImage img1 = QImage((const unsigned char*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();//简单地转换一下为Image对象,rgbSwapped是为了显示效果色彩好一些。
//ui.label->setPixmap(QPixmap::fromImage(img1));//将图片显示到ui的label中
}
void
getCamera::takingPictures(){
cam >> frame;
QImage img2 = QImage((const unsigned char*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();
ui.label_2->setPixmap(QPixmap::fromImage(img2));
///
//frame = cvQueryFrame(cam);//从摄像头抓取并返回每一帧
将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同摄像头使用的格式不同
//QImage img2 = QImage((const unsigned char*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();
//ui.label_2->setPixmap(QPixmap::fromImage(img2));//将图片显示到ui的label_2中
}
void
getCamera::closeCamera(){
timer->stop();
cam.release();
///
//timer->stop();//停止读取数据
//cvReleaseCapture(&cam);//释放内存
}
运行结果: