Qt视觉软件开发过程中,问题记录与思考
项目git地址,欢迎点赞、评论、提建议!!! QtVision/Qt多相机 at main · zuoyizhongguo/QtVision (github.com)
1、慎用指针类型,除非不得不用
- new、delete的位置不合适,可能造成与预想效果不一致的情况。
- 容易出现访问冲突(值类型未出现此情况)。
2、函数的输出型参数用&修饰。
经典案例 swap(a,b),如果把b当做输出型参数,这个函数不会改变b。因为值传递深拷贝。参考我博客c++笔记2(参考learncpp.com) - 夕西行 - 博客园 (cnblogs.com)的1部分标签内容。
我在相机帧转为QImage格式时犯了这个错误。
在其他地方调用
这个img是空的,因为对象img本身不会被改变。
3、图像格式转换为QImage后,emit这个QImage可能出现的问题
情况一:转换后直接emit
情况二:先调用封装的转换函数,再emit
这种情况可能出现 QPixmap::fromImage(img)访问冲突,在转换函数内用深拷贝解决。
OutImage = QImage(buffer, width, height, QImage::Format_RGB888).copy();
4、成功采集的帧指针建议深拷贝后使用。
帧指针指向的空间持续被相机清空、赋值。当采集成功时,如果让自定义的指针 m_ptr_success 指向这个成功采集的帧指针。那么在使用 m_ptr_success 的过程中可能造成内存读写冲突。
当然,也可以通过加锁方式解决。
5、推荐使用官方相机SDK中的回调函数,对帧率和CPU占用率有优势
当然也可以自己创建线程,将拉流死循环放在线程中执行。
回调函数帧率接近满帧(即使加锁),CPU占用率下降明显。
6、connect不应该放在频繁触发函数中
如,按钮继续、暂停来回频繁按下。
可以打开相机时connect,关闭相机时disconnect。
disconnect用法Qt disconnect函数_我不是萧海哇~~~~的博客-CSDN博客_disconnect()方法
7、让控件失效是个好办法
比如按钮触发的函数只允许被执行一次,或者按钮之间有先后关系(如打开相机,才能关闭相机)。
如果只靠代码防止误操作,代码量大而且可能考虑不全。
如按钮点击一下启动一个线程,被误点击了多次。最终可能只杀死了一个线程,其他的依然在跑。
8、自定义函数和官方函数使用时要有失败意识
自定义函数推荐:
- ① 函数返回bool。有时候需要确保这个函数正确执行。
- ② 函数内优先判断参数是否存在可用
官方函数推荐:
- ① 使用try catch。尤其是官方提供了异常捕获功能的。
参考博客Basler相机Bayer格式转Qt RGB888 - 夕西行 - 博客园 (cnblogs.com)