知识库

记录点点滴滴

关于opencv+cuda10、cuda10+NvOF的一点小记录

嗯好久没写 今天也只是做个小记录。

今天周五。这周一开始的工作是要比较光流法在各个平台上的应用。老师给了OpenCV中的DISOpticalFlow、2016一篇CVPR的DISOpticalFlow的实现和Nvidia公司产的一个光流支持包。这周弄完了Nvidia的光流包+opencv的初体验吧算是,小小介绍下。

Nvidia在最新的20系显卡提供了光线追踪功能,这个功能允许硬件计算光流。但是!整个平台需要(1)一块20系显卡,我用的是2080Ti(公家出钱hhh);(2)cuda10.0及以上的平台;(3)nvidia自己产的光流支持包(请见官网 我用的是Optical_Flow_SDK_1.0.13)。下面我就说下提供的光流包和sample中的小坑(还好吧,一般般坑)。

光流包除了三个头文件(其实只需要两个)以外,没有【实质上】的新东西。这三个头文件定义了一些函数、状态、枚举结构体等。写程序的时候加进去就行。三个文件分别是nvOpticalFlowCommon.h  nvOpticalFlowCuda.h  nvOpticalFlowD3D11.h 嗯上面头文件的两个后缀cuda和d3d11是对应cuda和directX的接口。这里插一句,虽然它上面说对windows平台要求cuda和directX,但我感觉好像是“或”的关系……我声明了一个DXSDK_DIR的环境变量,但感觉根本没用上啊(= =),并且我在改动后的程序中只使用了common+cuda头文件……但是还是建议大家装一下。

下面说示例工程中的文件。此处针对上面【实质性】做回答:虽然理论上只用那三个头文件+cuda10就应该能写光流程序,但!在sample中有大量的文件对cuda函数进行了细致的调用。包括但不限于:对各个光流对象合理的开创、调用和释放。对png和yuv图像的读取和放到光流接口中的状态的控制。真的是,离了这些文件简直寸步难行!此处我强烈建议对光流和cuda接触不多的新手(比如我),使用在samples->NvOF  和  Utils  中提供的.c和.h头文件来写光流程序。但是同样建议在写之前先对Doc文件夹中的NVOFA的Guide进行简要了解。至少看看还是好的。

但是Sample中也要做修改。Sample中提供的FreeImage我感觉是由于体量问题,只支持.png和.yuv格式的图像读入和计算光流。这对于基于OpenCV的开发者简直不能忍。简要说一下改到opencv环境下的几个问题:

1.图像  在Sample中采用了位图存储,存的4通道(ABGR),每通道8位的图像。改到opencv同样采用这个格式。我使用的是png彩图和tif灰度图,读入时候记得用 IMREAD_COLOR+cvtColor(, , CV_BGR2ABGR) 转换通道数。在下载到GPU中时,sample自带的图像下载过程包括了一个智能指针(我第一次见……长见识了)对位图的拷贝。这里我直接粘贴过来的,问题不大。

2.cuda环境  我不知道是不是cuda10改函数名了,好多函数看到都不熟。比如大部分用到的函数都是cu打头而不是cuda9中的cuda打头。在修改sample的时候,我把sample中的一个调用函数和主函数内容全放主函数里面了。在退出程序的时候老提示我对象不能销毁。后来发现是cuda的变量上下文(context)被我提前于对象销毁了,导致对象自己的析构函数不能执行。

周四周五帮老师修改一个问题,是关于使用cuda加速的opencv中的templateMatching。网上有例程可以看看(好像是官网的吧?忘了  我一开始的templateMatching的使用是从一个网站上抄的)。第一次用的时候是cuda9+opencv3.4.5,图像格式是U8,没有问题。但老师这次用的是cuda10+opencv3.4.5,一直卡在matching过程。我在两台机器上运行相同的程序,发现cuda9下,U8格式图像的templateMatching就可以,而cuda10下就不行!卧槽真神奇。后来可能是哪位神仙可怜,突然想试试32F格式的图像能不能在cuda10上做templateMatching。竟然可以!惊了。。。。(后来翻github发现有人发现了这个问题,好像是寄存器数据处理有误,它上面说要解决怎么没解决啊噗)

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注