关于在jetson上使用opencv读写报错的研究记录
问题描述:opencv和nvjpeg同时编译链接,运行时opencv读写会产生错误
问题背景:
之前的项目中把框架数据源里面用opencv解码的部分,改用jetson板子上自带的multimedia进行gpu解码加速优化了一波。解码用到了mm的dec接口,间接调用了nvjpeg的库。此时我们发现数据源和pipeline其实都走通了,但只要遇到用opencv写的图片调试功能就会报错,着实有点邪门。
解决历程:
用万能的vscode的gdb看了运行堆栈,发现堆栈中opencv的read接口莫名奇妙调用了nvjpeg的销毁函数
到了这里,有经验的开发者就应该已经猜到了,opencv中是调用了libjpeg.so的,而nvjpeg是对libjpeg的一层nvidia封装,当两个库同时链接时,opencv选择去调用了nvjpeg的接口,那么有没有解决错误的办法呢?我们看一下nvidia开发人员的回答:
https://forums.developer.nvidia.com/t/opencv-with-libnvjpeg/69949
We only support libnvjpeg.so to ru with gstreamer nvjpegdec/nvjpegenc and tegra_multimedia_api.
Running with OpenCV is not tested/verified. Other users may share experience.
The function names are the same and it may trigger double definitions.
We suggest users use NvJpegEncoder and NvJpegDecoder classes.
意思是他们支持了nvjpeg对gst和tegra的使用,opencv没有测过,可以问问其他使用者,nvjpeg和jpeg是封装关系,有大量同名函数会触发多重定义,nvidia推荐使用nvjpeg的接口进行编解码。
没错,又是该死的底层bug。
至此,该问题的解决办法就是剥离opencv和nvjepg了,但由于我在项目上的使用需要,目前暂时将opencv的读写接口改成普通文件流操作应付过去了,希望这篇记录能够帮到你,如果你有了更好的解决办法,也欢迎留言分享供大家学习。