首页 > 系统相关 >Linux系统配置Opencv+cuda+ffmpeg开发环境,-217:Gpu API call unknown error code问题排解

Linux系统配置Opencv+cuda+ffmpeg开发环境,-217:Gpu API call unknown error code问题排解

时间:2024-07-07 23:53:15浏览次数:22  
标签:217 code ffmpeg opencv 编译 API cuda 驱动 安装

Opencv是当前比较热门的图像处理开源算法库,但是随着深度学习在图像存储里领域的大放异彩,基于python的图像处理和深度学习算法大有超越opencv的趋势。opencv在最近的版本更新中,重点都放在了人工智能算法方面,本文介绍linux环境下配置支持GPU/cuda的ffmpeg和opencv开发环境,并将其中遇到的问题记录下来,方便查询。

1. 基础环境

 操作系统:目前在Ubuntu20.04,24.04,Kylin OS V10上都进行国配置。nvidia版本555, cuda版本12.5,ffmpeg版本7.01,opencv版本4.10.0(含opencv_contrib).

2. nvidia相关安装和配置

 从nvidia官网下载cuda12.5安装包,其中自带555版本的显卡驱动。直接运行安装包,可以自动安装显卡驱动和cuda。这里要注意,有的系统(如kylin os)直接安装显卡驱动会失败,需要先卸载以前的旧版本驱动。对于没有旧nvidia驱动的系统安装依然失败,那就需要手动将系统自带驱动禁用,按照最传统的方法安装该驱动和粗大。同时选择不安装驱动的就需要注意该版本粗大兼容的显卡驱动版本号,例如该版本兼容525以上版本的驱动,如果旧的驱动大于525就可以不安装驱动,只安装cuda。

cuda安装完成后需要按照提示,在系统环境变量PATH和LD_LIBRARY_PATH中添加cuda的可执行程序目录和库目录。同时建议添加CUDA_PATH环境变量。

3. ffmpeg编译和安装

 按照官方Using_FFmpeg_with_NVIDIA_GPU_Hardware_Acceleration.pdf文件配置ffmpeg。如果不看文档的就直接搜一个nv-codec-headers的文件,并进行make install。经过测试ffmpeg7.10编译有问题,最新的nvidia video codec SDK中新定义的变量并没有在ffmpeg7.10中进行更新,直接编译会有找不到定义的变量。也有可能是我自己下载的错误的nvcodec SDK(其实不需要),如果像我一样下载并将库和头文件拷贝到系统目录下,会造成后面opencv莫名奇妙的问题。然后按照上面提到的官方文件进行configure配置,检查配置结果中是否含有h264_cuvid、hevc_cuvid解码器,和h264_nvenc、hevc_nvenc编码器,h264_nvdec、hevc_nvdec硬件解码,以及ffplay。其实我个人主要用到的是h264_cuvid进行解码和ffplay进行播放测试视频。为了能够编译ffplay需要系统安装或编译SDL2库。同时,SDL2库编译的时候需要安装一个alsa音频处理模块,否则编译SDL2和ffmpeg都不会有问题,但是运行的时候会报错误。

4. opencv编译和安装

 将opencv_contrib文件中的内容拷贝到opencv库中,也可以通过cmake配置的方式编译opencv_contrib,但是我喜欢直接拷贝合并。注意,对于不想编译opencv_contrib,又需要使用GPU/cuda的需要编译opencv_cudev库及其他几个cuda算法模块。点击configure。由于国内环境,编译第三方库的时候会下载一些算法模型文件,经常需要耗费大量时间又难以下载,所以这里建议直接屏蔽WITH_IPP\WITH_ADE\BUILD_opencv_face\BUILD_opencv_wechat_qrcode\BUILD_opencv_xfeature2d。有的编译webp的时候会出现编译器错误,这里也可以将其屏蔽掉。需要打开WITH_CUDA,再次进行configure。检查cuda模块是否找到。这里有个大问题,就是CUDA_nvcuvid_LIBRARY和CUDA_nvidia-encode_LIBRARY两个库是找不到的。如果这个时候你上网搜索,会让你下载Video_Codec_SDK,并拷贝头文件和库到系统目录或cuda目录下,这样虽然能够编译通过,但是后面英语会出问题,因为这个SDK是对于那些没有安装nvidia驱动的环境提供的,所以因为我们已经安装了驱动,驱动自带有这两个库文件, 位于/usr/lib/x86_64-linux-gun目录下。但是没有头文件。我的做法是将SDK的头文件拷贝到cuda/include目录下,并在cuda/lib64下面建立这两个编解码库的软连接(个人感觉这不是一个合适的解决办法,但是暂时没有找到其他方式)。再次执行configure,make,make install。

5. -217:Gpu API call Unkown error code错误排解

如上所述,如果直接使用SDK中的库,会出现无法识别的错误。删除SDK的编解码库,将驱动自带的库拷贝到cuda下或,建立软连接可以正常编译和运行。

标签:217,code,ffmpeg,opencv,编译,API,cuda,驱动,安装
From: https://www.cnblogs.com/uuvv/p/18289062

相关文章

  • ts 常用api和特性
    交叉类型将多个类型进行合并成一个类型typePerson={name:string;age:number;}typeEmployee=Person&{employeeId:number;}联合类型联合类型通过|符号连接多个类型从而生成新的类型。它主要是取多个类型的交集,即多个类型共有的类型才是联合类型最终的类型t......
  • [LeetCode] 134. Gas Station
    想到了提前判断和小于0的情况,懒得写,果然被阴间用例10万个加油站坑了。classSolution:defcanCompleteCircuit(self,gas:List[int],cost:List[int])->int:#1n=len(gas)ifn==1:ifgas[0]>=cost[0]:ret......
  • codeforces1849 D. Array Painting
    题目链接https://codeforces.com/problemset/problem/1849/D题意输入\(n(1\leqn\leq2e5)\)和长为\(n\)的数组\(a(0\leqa[i]\leq2)\)。最初,数组的每个元素都是蓝色的。有两种类型的操作:支付一枚硬币,选择一个蓝色元素,将其涂成红色。选择一个不等于\(0\)的红......
  • LeetCode 算法:岛屿数量 c++
    原题链接......
  • Apifox 6月更新|定时任务、内网自部署服务器运行接口定时导入、数据库 SSH 隧道连接
    Apifox新版本上线啦!!! 看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性:自动化测试支持设置「定时任务」 支持内网自部署服务器运行「定时导入」数据库均支持通过SSH隧道连接自动化测试数据库操作优化 将Apifox更新至最新版,一起开启全新体验......
  • 解决《龙珠斗士Z》游戏启动问题:api-ms-win-crt-runtime-l1-1-0.dll文件缺失的详细指南
    对于热爱格斗游戏和《龙珠》系列的玩家来说,《龙珠斗士Z》无疑是一款令人兴奋的作品,它以其精美的画面、流畅的战斗体验以及对原作角色的精彩还原而受到广大玩家的喜爱。然而,在享受这场动漫与格斗完美融合的盛宴之前,一些玩家可能会遇到一个让人头疼的技术问题——游戏启动时提示......
  • Denso Create Programming Contest 2024(AtCoder Beginner Contest 361)E-F
    E求一条树上的路径,使得走遍整棵树花费最小。我们容易发现树上的某条简单路径只需走一次,除此之外所有的路径都需要走两次,那么显而易见,我们需要求树的直径,之后将剩余的路径权值和乘二加上直径权值就可以。F数学题,对于数学题而言,个人感觉时间复杂度的计算对于题目的求解非常重......
  • .NET CORE WEBAPI 后端获取来源IP
    之前看别的地方说获取IP用ip=HttpContext.Current.Request.UserHostAddress;在ASP.NETCore2.0及更高版本中不起作用。您必须从ConfigureServices方法中的Startup.cs类中注入  HttpContextAccessor实例。 实际上换成ip=HttpContext.Connection.RemoteIpAddress.ToStr......
  • [LeetCode] 238. Product of Array Except Self
    坑真的很多,首先要处理全零reduce没有值typeerror的问题。classSolution:defproductExceptSelf(self,nums:List[int])->List[int]:total=reduce(mul,nums)ret=[]iftotal==0:try:total=reduce(mul,[......
  • 刷爆leetcode第九期
    题目一单值二叉树如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回true;否则返回false。题目图片如下我们这里主要是判断下根的值和它的左孩子还有右孩子相不相等如果相等返回true如果不相等返回false(当然这里还需要......