搜索
bottom↓
回复: 23

[讨论]如何提高c++图像处理程序的实时性

[复制链接]

出0入0汤圆

发表于 2016-11-20 18:22:08 | 显示全部楼层 |阅读模式
    小弟用vs2010写了一个图像处理程序。相机最高帧率是60fps,以太网接口输出。开发平台是vs2010+opencv。c++写的。此为背景。
    最初程序只是读取图像然后显示出来,程序可以运行到60fps。但是加入了边缘检测和霍夫检测之后,程序只能运行到25fps,但是此时该进程只占用了1%的cpu,还有85%的cpu空闲。   
    因为采用的是    采集-->处理-->显示  这样的流程,所以没有用多线程,只用了一个线程。现在想提高实时性,也就是在增加算法之后,怎样达到60fps。
恳请各位大神指点一二。感激不尽。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-11-20 18:27:33 | 显示全部楼层
你自己都提出了解决办法了!~ 多线程啊!

出0入0汤圆

 楼主| 发表于 2016-11-20 18:29:16 | 显示全部楼层
li.wen 发表于 2016-11-20 18:27
你自己都提出了解决办法了!~ 多线程啊!

但是针对于我这个应用,不知道该怎样划分成多线程啊,采集-->灰度化--->边缘检测-->霍夫检测-->显示输出,请指点怎样多线程啊?

出0入0汤圆

发表于 2016-11-20 18:32:38 | 显示全部楼层
逐帧显示, 跳帧检测, 你要逐帧检测, cpu跟不上啊, 一个线程显示, 一个线程检测

出0入0汤圆

 楼主| 发表于 2016-11-20 18:35:11 | 显示全部楼层
liwey 发表于 2016-11-20 18:32
逐帧显示, 跳帧检测, 你要逐帧检测, cpu跟不上啊, 一个线程显示, 一个线程检测 ...

跳帧检测意思是不要每一帧都去识别是吗?
我就是觉得cpu使用率要是能多给我分配一点就好了啊。

出0入0汤圆

发表于 2016-11-20 19:50:13 | 显示全部楼层
sgzzour 发表于 2016-11-20 18:35
跳帧检测意思是不要每一帧都去识别是吗?
我就是觉得cpu使用率要是能多给我分配一点就好了啊。 ...

不是这么个思路,而是线程池的思路。
所有的Frame扔进一个queue,然后从线程池里挑一个空闲的线程,dequeue一个Frame,扔给它去处理。

出300入477汤圆

发表于 2016-11-20 20:09:27 来自手机 | 显示全部楼层
Scarlette 发表于 2016-11-20 19:50
不是这么个思路,而是线程池的思路。
所有的Frame扔进一个queue,然后从线程池里挑一个空闲的线程,deque ...

对,这是正路

出0入4汤圆

发表于 2016-11-21 00:23:34 来自手机 | 显示全部楼层
一个生产者 多个消费者。

出0入91汤圆

发表于 2016-11-21 12:18:45 来自手机 | 显示全部楼层
sgzzour 发表于 2016-11-20 18:29
但是针对于我这个应用,不知道该怎样划分成多线程啊,采集-->灰度化--->边缘检测-->霍夫检测-->显示输出 ...

25fps很高了呀 作用在什么场合

出0入0汤圆

发表于 2016-11-21 12:59:52 | 显示全部楼层
再就是优化算法,降低算法的计算量了。

出0入0汤圆

发表于 2016-11-21 13:14:24 | 显示全部楼层
sgzzour 发表于 2016-11-20 18:29
但是针对于我这个应用,不知道该怎样划分成多线程啊,采集-->灰度化--->边缘检测-->霍夫检测-->显示输出 ...

采集一个线程,显示一个线程。算法一个或多个线程。
中间用共享内存的方式实现数据和信号的同步转移。
通过信号来传递Ready,NotReady的消息

如果你用QT,会很方便…… 当然,采用VS也有对应的办法。

出0入0汤圆

 楼主| 发表于 2016-11-21 13:19:11 | 显示全部楼层
li.wen 发表于 2016-11-21 13:14
采集一个线程,显示一个线程。算法一个或多个线程。
中间用共享内存的方式实现数据和信号的同步转移。
通 ...

多谢啦。我去试一试,新手入门多线程。还请多指点,有什么好的书籍资料推荐吗?

出0入0汤圆

发表于 2016-11-21 13:29:37 | 显示全部楼层
这种情况下多线程是必须的,同时要降低图像处理的复杂度才行。

出0入0汤圆

发表于 2016-11-21 16:18:48 | 显示全部楼层
sgzzour 发表于 2016-11-21 13:19
多谢啦。我去试一试,新手入门多线程。还请多指点,有什么好的书籍资料推荐吗? ...

第一步先学会看VS的Help, Document;搜索关键字“thread”等等……之类的.

比看书籍要好和快!~

很多初级的书籍还不如软件本身的Help呢,或者说直接就是从Help中翻译过来的。

出0入0汤圆

发表于 2016-11-21 16:27:14 | 显示全部楼层
看下有几个核心,可以将采集和显示线程绑定到一个核心上。 其他CPU核心根据处理流水线的上算法的复杂程度分配线程。 采集和显示用到系统调用,可能会存在等待的情况,处理算法应该是CPU密集型任务。

出0入0汤圆

发表于 2016-11-21 17:16:25 | 显示全部楼层
显卡加速!
多核加速!

显示线程和处理线程一定要分开。显示线程等待的东西太多了(窗口服务器、输入外设)。

跳帧检测,也是个办法

出0入0汤圆

 楼主| 发表于 2016-11-21 18:14:38 | 显示全部楼层
kelp 发表于 2016-11-21 16:27
看下有几个核心,可以将采集和显示线程绑定到一个核心上。 其他CPU核心根据处理流水线的上算法的复杂程度分 ...
可以将采集和显示线程绑定到一个核心上


计算机是4核的,但是这个是怎么实现呢?求指点方向或者思路。多谢啦

出0入0汤圆

 楼主| 发表于 2016-11-21 18:15:42 | 显示全部楼层
xivisi 发表于 2016-11-21 17:16
显卡加速!
多核加速!

显卡加速?具体实现是用directx吗?还是GPU运算?求指点,多谢啦

出0入0汤圆

发表于 2016-11-21 18:29:10 | 显示全部楼层
系统有接口的类似SetScheduleAffinity, 线程间通信就像上面大家回答的样子就可以了。

出0入0汤圆

发表于 2016-11-21 18:30:21 | 显示全部楼层
霍夫检测 这个运算比较耗资源,可以测试下这个运算处理一帧图片消耗的时间。

出0入0汤圆

发表于 2016-11-21 19:48:45 来自手机 | 显示全部楼层
用CUDA似乎不错,不要问我怎么知道的,我也是瞎说的

出0入85汤圆

发表于 2018-12-6 10:31:39 | 显示全部楼层
看看MVC架构

出0入0汤圆

 楼主| 发表于 2018-12-7 10:23:57 | 显示全部楼层

多谢指点.

出0入0汤圆

发表于 2018-12-10 08:39:28 来自手机 | 显示全部楼层
sgzzour 发表于 2018-12-7 10:23
多谢指点.

楼主这么久了也说说最后的结果吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 13:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表