转移linux(一)qt+opencv3.3视频播放器加摄像头读取

windows MFC c# 玩不了了 打算走嵌入式线路了

从opencv自己编译了n天,到今天第一个qt项目,差不多两周吧,自己电脑实体机装了**deep in linux ** 和 windows双系统,所以体验体验linux编程的乐趣


QT cteater的设计师界面效率快的不要不要的,更何况是c++,而且还吹嘘的什么跨平台。

附上开发的设计图

alt

软件截图:

alt

界面来讲还好吧,比mfc好看,主要视频还是用到QT自带的多线程来逐帧播放的,调试了5个小时,哈哈哈还是挺欣慰的,以后打算入手树梅派来做项目了。

就简单的附上视频的按钮以及核心代码吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
void MainWindow::on_openFileBtn_clicked()
{
// 打开视频文件按钮 有播放的视频的话会先停止
isOpenFile=true;
if(capture.isOpened())
{
capture.release();
}
//文件类型的对话框 不需要用指针新建一个类
//自行可以添加视频格式
QString FileName=QFileDialog::getOpenFileName(this,tr("打开文件"),".",
tr("Video Files(*.avi *.mp4 *.flv)"));
// capture.open(FileName.toLocal8Bit.data()); //防止字符串乱码转化
capture.open(FileName.toStdString());//字符串(全英文目录比较好)的转化
if(capture.isOpened())
{
rate=capture.get(CV_CAP_PROP_FPS);

if(isOpenFile)
{
vd_x=capture.get(CV_CAP_PROP_FRAME_COUNT);
ui->videoLong->setRange(0,vd_x);
}
capture>>frame;
if(!frame.empty())
{
//自适应窗口大小
width_x=ui->ImageLabel->width()*1.0/frame.cols;
height_x=ui->ImageLabel->height()*1.0/frame.rows;

cv::resize(frame,frame,Size(),width_x,height_x);
image=Mat2QImage(frame);
//显示在label上
ui->ImageLabel->setPixmap(QPixmap::fromImage(image));

timer=new QTimer(this);
//定时器线程 时间设置 相当与帧率
timer->setInterval(1000/rate);
connect(timer,SIGNAL(timeout()),this,SLOT(nextFrame()));

timer->start();
}
}

return;
}


QImage Mat2QImage(Mat cvImg)
{
//Mat 类型转 QImage 类似与Mat转bitmap
QImage qImg;
//判断通道个数
if(cvImg.channels()==3)
{
cvtColor(cvImg,cvImg,CV_BGR2RGB);

qImg=QImage((const unsigned char *)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888
);
}
else if(cvImg.channels()==1)
{
qImg=QImage((const unsigned char *)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_Indexed8
);
}
else
{
qImg=QImage((const unsigned char *)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888
);
}
return qImg;
}
void MainWindow::nextFrame()
{
capture>>frame;
if(!frame.empty())
{
//调整大小
cv::resize(frame,frame,Size(),width_x,height_x);
image=Mat2QImage(frame);
ui->ImageLabel->setPixmap(QPixmap::fromImage(image));
if(isOpenFile)
{
ui->videoLong->setValue((int)(capture.get(CV_CAP_PROP_POS_FRAMES)));
}
}
}