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)

 

posted @ 2022-09-21 16:41  夕西行  阅读(219)  评论(0编辑  收藏  举报