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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/******************************************************************
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();
}