如何简化OpenCV中VideoCapture的帧获取函数?去除临时变量
关于OpenCV摄像头帧获取函数的简化问题
首先得指出你原代码里的严重问题:你返回的是局部变量frame的引用,这属于未定义行为。局部变量在函数执行完毕后会被销毁,调用方拿到的是悬空引用,后续使用这个引用会导致程序崩溃或不可预料的错误。
回到你的问题:想去掉临时变量frame改成内联形式是可行的,但前提是先修正返回值类型——不能返回引用,要返回cv::Mat对象(值返回),利用OpenCV中cv::Mat的移动语义,这种返回几乎不会有额外性能开销。
给你两种简化写法:
- 利用逗号表达式,省去单独的变量声明行:
cv::Mat OpenCvCamera::getFrame() { cv::Mat frame; return camera >> frame, frame; }
逗号表达式会先执行camera >> frame完成帧读取,然后返回frame对象。
- 更紧凑的写法(需确保你的OpenCV版本支持运算符重载顺序):
cv::Mat OpenCvCamera::getFrame() { return cv::Mat{} << camera; }
不过这种写法可读性稍差,实际项目里更推荐第一种。
另外要注意:无论怎么简化,核心是不能返回局部对象的引用。如果你的场景确实需要返回引用,那得把frame改成OpenCvCamera类的成员变量,每次读取帧到这个成员里再返回它的引用,但这样要注意线程安全问题(多线程调用时)。
内容的提问来源于stack exchange,提问作者EliaTolin
相关产品推荐
相关产品推荐

