You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
2.9 KiB

6 months ago
/******************************************************************
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 <QImage>
#include <QDebug>
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) {
/* 为什么是331000/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();
}