GOQTTemplate简单介绍
集合OpenCV的视频功能和QCamera的摄像头接口,开发出易于理解的、结构简单的摄像头控制和采集框架。
MainWindow
:
:MainWindow(QWidget
*parent)
: QMainWindow(parent),
ui( new Ui : :MainWindow)
{
ui - >setupUi( this);
timer = new QTimer( this);
imag = new QImage(); // 初始化
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
bMethod = false; //是否使用算法
//填充界面控件
const QList <QCameraInfo > availableCameras = QCameraInfo : :availableCameras();
for ( const QCameraInfo &cameraInfo : availableCameras)
{
ui - >comboCamera - >addItem(cameraInfo.description());
}
ui - >comboCamera - >setCurrentIndex( 0);
bCameraOpen = false;
ui( new Ui : :MainWindow)
{
ui - >setupUi( this);
timer = new QTimer( this);
imag = new QImage(); // 初始化
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
bMethod = false; //是否使用算法
//填充界面控件
const QList <QCameraInfo > availableCameras = QCameraInfo : :availableCameras();
for ( const QCameraInfo &cameraInfo : availableCameras)
{
ui - >comboCamera - >addItem(cameraInfo.description());
}
ui - >comboCamera - >setCurrentIndex( 0);
bCameraOpen = false;
//显示的图像自动缩放
ui->label->setScaledContents(true);
ui->label_2->setScaledContents(true);
}
在界面初始化的时候,就直接填充界面。注意这里
setScaledContents的设置使得图像能够填充满整个窗体。
另一个非常关键的一句就是
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 时间到,读取当前摄像头信息
相当于ontimer,非常直观吧。
// 从摄像头中抓取并返回每一帧
void MainWindow : :readFarme()
{
videocapture - >read(matFrame);
//是否图像处理
Mat tmp;
if(bMethod) //这里只是简单地实现一个Canny算法
{
cvtColor(matFrame,tmp,COLOR_BGR2GRAY);
cv : :Canny(tmp,tmp, 100, 255, 3);
cvtColor(tmp,matDst,COLOR_GRAY2BGR);
}
else
{
matDst = matFrame.clone();
}
// 格式转换
QPixmap qpixmap = Mat2QImage(matDst);
// 将图片显示到label上
ui - >label - >setPixmap(qpixmap);
}
void MainWindow : :readFarme()
{
videocapture - >read(matFrame);
//是否图像处理
Mat tmp;
if(bMethod) //这里只是简单地实现一个Canny算法
{
cvtColor(matFrame,tmp,COLOR_BGR2GRAY);
cv : :Canny(tmp,tmp, 100, 255, 3);
cvtColor(tmp,matDst,COLOR_GRAY2BGR);
}
else
{
matDst = matFrame.clone();
}
// 格式转换
QPixmap qpixmap = Mat2QImage(matDst);
// 将图片显示到label上
ui - >label - >setPixmap(qpixmap);
}
这里使用了
Mat2QImage函数,将图像转换为
qpixmap,并且显示在
label上
//打开磁盘上的图片
void MainWindow : :on_pushButton_clicked()
{
//第3个参数表示查找文件时从哪个目录开始,如果为"."的话,表示从该工程目录开始查找,最后那个参数的过滤器的名字之间
//要用空格,否则识别不出来
QString img_name = QFileDialog : :getOpenFileName( this, tr( "Open Image"), ".",tr( "Image Files(*.png *.jpg *.jpeg *.bmp)"));
if(img_name == "")
return;
//toAscii()返回8位描述的string,为QByteArray,data()表示返回QByteArray的指针,QByteArray为字节指针
//现在已改为toLatinl函数
Mat src = imread(img_name.toLatin1().data());
cvtColor( src, src, CV_BGR2RGB );
QImage img = QImage( ( const unsigned char *)(src.data), src.cols, src.rows, QImage : :Format_RGB888 );
ui - >label - >setPixmap( QPixmap : :fromImage(img) );
img_name.clear();
}
void MainWindow : :on_pushButton_clicked()
{
//第3个参数表示查找文件时从哪个目录开始,如果为"."的话,表示从该工程目录开始查找,最后那个参数的过滤器的名字之间
//要用空格,否则识别不出来
QString img_name = QFileDialog : :getOpenFileName( this, tr( "Open Image"), ".",tr( "Image Files(*.png *.jpg *.jpeg *.bmp)"));
if(img_name == "")
return;
//toAscii()返回8位描述的string,为QByteArray,data()表示返回QByteArray的指针,QByteArray为字节指针
//现在已改为toLatinl函数
Mat src = imread(img_name.toLatin1().data());
cvtColor( src, src, CV_BGR2RGB );
QImage img = QImage( ( const unsigned char *)(src.data), src.cols, src.rows, QImage : :Format_RGB888 );
ui - >label - >setPixmap( QPixmap : :fromImage(img) );
img_name.clear();
}
可以直接使用函数,打开磁盘上的图片。
//打开摄像头
void MainWindow : :on_pushButton_OpenCam_clicked()
{
int i = ui - >comboCamera - >currentIndex();
//打开摄像头,从摄像头中获取视频
if(bCameraOpen)
{
videocapture - >release(); //kill camera first
}
videocapture = new VideoCapture(i);
bCameraOpen = true;
//这里给出了一个非常大的分辨率,如果摄像头没有这么大的分辨率,则会默认打开其支持的最大分辨率
videocapture - >set(CV_CAP_PROP_FRAME_WIDTH, 2592);
videocapture - >set(CV_CAP_PROP_FRAME_HEIGHT, 1944);
// 开始计时,超时则发出timeout()信号
timer - >start( 0);
}
void MainWindow : :on_pushButton_OpenCam_clicked()
{
int i = ui - >comboCamera - >currentIndex();
//打开摄像头,从摄像头中获取视频
if(bCameraOpen)
{
videocapture - >release(); //kill camera first
}
videocapture = new VideoCapture(i);
bCameraOpen = true;
//这里给出了一个非常大的分辨率,如果摄像头没有这么大的分辨率,则会默认打开其支持的最大分辨率
videocapture - >set(CV_CAP_PROP_FRAME_WIDTH, 2592);
videocapture - >set(CV_CAP_PROP_FRAME_HEIGHT, 1944);
// 开始计时,超时则发出timeout()信号
timer - >start( 0);
}
摄像头的打开也非常直接。
添加了一些修改,使用QT来做,真的是非常方便:
项目地址:
https://github.com/jsxyhelu/GOQTTemplate3
欢迎提出宝贵意见。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端