记录PyQt5 开发(一)QCamera

最近在帮导师做一个项目,需求要用Python做一个桌面软件。如果做正式项目用tk肯定是不行的,所以第一个想到的就是PyQt5

这是我做了两个月后,才知道,PyQt其实并不是Qt的官方Python支持。官方的Qt for python是PySide2,这两者在我使用上主要是Signal(信号槽)部分不太一样,PySide2用的是和C++ Qt相似的语法结构,而PyQt则用了自己的pyqtSignal,其他部分两家都继承了C++的接口,区别不是很大。

项目要用到摄像头视频监控,一开始我就想到了用QCamera,但怎么都开启不了(可能是太菜了)后面进度在催,没办法用了第二种方案,OpenCV的cv2.Videocapture()。这下好了,给我整的生活不能自理,不知道cv2 Videocapture这个库到底是怎么实现的,bug一堆不说,运行起来还各种闪退,不稳定。最后不得不用了Capture Thread+ Fetch Thread的方案,即一个线程不停地去抓取摄像头的数据帧,另一个线程和主线程沟通,才勉强维持稳定(中间还用了一堆Mutex同步线程,头发都要掉光)。

但后来发现,这样做资源开销大的离谱。尤其是当我们项目用到了4K分辨率的摄像头时,主线程基本卡死不能动了(光一个摄像头就占用了8核CPU的40%,这还是4GHz x86的CPU啊)项目还要用四个摄像头,这要跑起来难道得用服务器?

痛定思痛,就算cv2的解决方案维护了两个月,也只能放弃,转头认真研究QCamera。

QCamera是Qt对于摄像设备的一个抽象,所以它首先初始化需要锁定一个摄像头。这就需要QCameraInfo类提供系统中可用摄像头的信息。

const QList<QCameraInfo> cameras =QCameraInfo::availableCameras();

for (const QCameraInfo&cameraInfo : cameras) qDebug() << cameraInfo.deviceName();

然后,初始化QCamera。

下面,要给QCamera找一个视频输出的区域QCameraViewFinder。QCamera支持QVideoWidget,QGraphicsVideoItem,QAbstractVideoSurface三种接口,感兴趣的小伙伴可以去了解一下区别。这三种在QtDesigner里都找不到,没关系,我们可以在界面里先预留一个QGridLayout,用来动态添加view。

接下来,就是保存图片了。QCamera需要拍摄图片,用的是QCameraImageCapture类。这个类初始化用QCamera对象作为参数,然后就可以进行capture操作。但是capture必须写入硬盘(我也不知道为什么,但是如果需要高性能或者快速拍摄,这个肯定行不通,因为写入硬盘是非常非常缓慢的,甚至需要界面中添加等待提示,因为我们摄像头4K拍出来有10MB,保存要十几秒,这也是我认为Qt做的不够好的地方,为什么不能加一个capture到QImage的接口)但是好在项目刚好需要保存在本地。

这里有一个细节,因为capture()写入硬盘和其他线程是异步的,你不能capture()完了立马cam.stop(),否则会capture失败。所以我加了个简单的计数判断,达到finish计数才stop。这个后面可以再改进。

    到这里QCamera用法基本上就结束了,可以看到Qt5虽然也有不足,但比起cv2.Videocapture还是做的好不少,Cpu占用率也下来了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容