/****************************************************************** Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved. * @projectName 05_opencv_camera * @brief camera.cpp * @author Deng Zhimao * @email 1252699831@qq.com * @net www.openedv.com * @date 2021-03-17 *******************************************************************/ #include "camera.h" /* opencv4 */ #if __arm__ #include "opencv4/opencv2/core/core.hpp" #include "opencv4/opencv2/highgui/highgui.hpp" /* CV_CAP_PROP_FRAME_WIDTH这样的宏在此头文件里 */ #include "opencv4/opencv2/videoio/legacy/constants_c.h" #else /* Ubuntu18上使用的opencv3,头文件路径 */ #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #endif #include #include Camera::Camera(QObject *parent) : QObject(parent) { /* 实例化 */ capture = new cv::VideoCapture(); timer = new QTimer(this); /* 信号槽连接 */ connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut())); } Camera::~Camera() { delete capture; capture = NULL; } void Camera::selectCameraDevice(int index) { /* 如果有其他摄像头打开了,先释放 */ if (capture->isOpened()) { capture->release(); } /* 打开摄像头设备 */ capture->open(index); /* 设置采集摄像头的分辨率的宽度 */ capture ->set(CV_CAP_PROP_FRAME_WIDTH, 640); /* 设置采集摄像头的分辨率的高度 */ capture ->set(CV_CAP_PROP_FRAME_HEIGHT, 480); /* 设置亮度 */ capture ->set(CV_CAP_PROP_BRIGHTNESS, 1); /* 设置曝光 */ capture ->set(CV_CAP_PROP_EXPOSURE, -7); /* 设置对比度 */ capture ->set(CV_CAP_PROP_CONTRAST, 60); } bool Camera::cameraProcess(bool bl) { if (bl) { /* 为什么是33?1000/33约等于30帧,也就是一秒最多显示30帧 */ timer->start(33); } else { timer->stop(); } /* 返回摄像头的状态 */ return capture->isOpened(); } void Camera::timerTimeOut() { /* 如果摄像头没有打开,停止定时器,返回 */ if (!capture->isOpened()) { timer->stop(); return; } static cv::Mat frame; *capture >> frame; if (frame.cols) /* 发送图片信号 */ emit readyImage(matToQImage(frame)); } QImage Camera::matToQImage(const cv::Mat &img) { /* USB摄像头和OV5640等都是RGB三通道,不考虑单/四通道摄像头 */ if(img.type() == CV_8UC3) { /* 得到图像的的首地址 */ const uchar *pimg = (const uchar*)img.data; /* 以img构造图片 */ QImage qImage(pimg, img.cols, img.rows, img.step, QImage::Format_RGB888); /* 在不改变实际图像数据的条件下,交换红蓝通道 */ return qImage.rgbSwapped(); } /* 返回QImage */ return QImage(); }