Ubuntu20.04 在anaconda上,opencv-python支持h264编码

最新更新

下边以前整绕了,见这篇即可,若是想c++编译opencv看下边,忽略以前折腾的支持opencv-python……

以下旧

若装了anaconda想屏蔽anaconda编译opencv

opencv使用ffmpeg进行视频流的编解码,对于h264格式视频,需要额外安装openh264

  FFMPEG build includes support for H264 encoder based on the OpenH264 library.

  OpenH264 Video Codec provided by Cisco Systems, Inc.

  See https://github.com/cisco/openh264/releases for details and OpenH264 license.

  OpenH264 library should be installed separatelly. Downloaded binary file can be placed into global system path
  (System32 or SysWOW64) or near application binaries (check documentation of "LoadLibrary" Win32 function from MSDN).

  Or you can specify location of binary file via OPENH264_LIBRARY environment variable.

使用conda安装libopenh264库即可。参考conda-forge / packages / openh264

conda install -c conda-forge openh264

如果无法安装成功,那么就下载该文件进行手动安装

pip install --use-local openh264-2.1.1-h780b84a_0.tar.bz2

遇到的问题

用anaconda下的python跑依旧无法编码h264,但Ubuntu自带的即usr/bin下的python3.x 跑却是可以,
可以由此寻找解决思路,很不幸,最终还是没搞懂啥情况。
估计还是自带的python可以正确找到openh264

参考
参考

上面的问题没法解决,也许可以降低版本吧,没试

最终采取方案,在anaconda下,通过编译opencv使得opencv-python支持h264

操作系统是 Ubuntu20.04 64位
官网c++编译教程1
opencv-python 编译教程2

首先Ubuntu得能放h264

sudo apt install ubuntu-restricted-extras

开始没反应过来是Ubuntu不能放,一直以为是自己的编译问题,,,明明编译成功了为啥还是opencv-python存的h264视频还是不能放,,,结果,呃呃。

安装依赖

自行安装anaconda,然后安装opencv依赖:


sudo apt install build-essential cmake git python3-dev python3-numpy \
libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer1.0-dev libgtk-3-dev libgtk2.0-dev \
libpng-dev libjpeg-dev libopenexr-dev libtiff-dev libwebp-dev \
libopencv-dev x264 libx264-dev libssl-dev ffmpeg

sudo apt remove -y x264 ffmpeg libx264-dev
sudo apt install x264 libx264-dev ffmpeg pkg-config

sudo apt install libgtk2.0-dev
sudo apt install gdal-bin
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

建议卸载pip安装的opencv-python系列,我没试过不卸载会咋地,,,应该会被覆盖吧,,,

编译安装

关于cmake的参数配置见官网教程
下载opencv源码:
https://github.com/opencv/opencv.git
下面这个可以不要,不然各种download让你焦虑
https://github.com/opencv/opencv_contrib
上面opencv和/opencv_contrib都是4.5.3

关于不装opencv-contrib有两个个download下载可以见下方分割线后面提到的,但貌似不处理也没啥,另外可以安装opencv-contrib,按需求。
以下是成功的cmake配置,未装opencv-contrib。不指定CMAKE_INSTALL_PREFIX默认为/usr/local,要指定其他python3所以路径:
以下是不添加opencv_contrib的版本:
opencv目录下新建build文件夹,然后cmake一顿操作:

cmake -D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_opencv_python2=OFF \
-D WITH_GDAL=ON \
-D CMAKE_INSTALL_PREFIX=$CONDA_PREFIX \
-D PYTHON3_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; import os; print(os.path.join(sysconfig.get_config_var('LIBDIR'), sysconfig.get_config_var('LDLIBRARY')))") \
-D PYTHON3_EXECUTABLE=$(which python) \
-D PYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..

sudo make -jx

make -j$[$(nproc)-1]

sudo make install

成功cmake截图

Ubuntu20.04 在anaconda上,opencv-python支持h264编码

遇到报错

ImportError: /home/user/anaconda3/bin/../lib/libgio-2.0.so.0: undefined symbol: g_uri_join

locate libgio-2.0.so.0
/home/user/anaconda3/lib/libgio-2.0.so.0
/home/user/anaconda3/lib/libgio-2.0.so.0.6800.1
...................

/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.6400.6
mv /home/user/anaconda3/lib/libgio-2.0.so.0 /home/user/anaconda3/lib/libgio-2.0.so.0bp
sudo ln -s /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 /home/user/anaconda3/lib/libgio-2.0.so.0

后续环境问题

目前尝试毕竟好的解决方案
记录anaconda一大坑小节

下方是有缺解决方案,嫌麻烦的可以采取:
在安装albumentations时,其依赖opencv-python-headless,然后opencv就又gg了,其实一思考,觉得可能是安装opencv-python-headless时把什么破坏了,然后我就在pip安装opencv-python,然后奇迹般又好了。如果opencv-python有很多QObject::moveToThread: Current thread (0x55c9b9d98c60) is not the object’s thread (0x55c9b9988490).这种行,没事,卸载opencv-python,opencv-python-headless,albumentations在安装opencv-python-headless,albumentations,去编译文件夹uninstall在install。

尝试记录

1.安装依赖时不装ffmpeg,编译之后会发现不支持h264,结果还是支持,,不清楚原因了,也许自己编译就默认支持h264或者anaconda里有相关的库给对上了,,

记录失败

以下是失败的一些尝试,最后才发现自己还是太嫩了,第一没有理解到anaconda在装了之后就覆盖了系统自带的python的路径,对的你cmake不指定PYTHON3_EXECUTABLE也能自动找到anaconda下的python。第二是关于编译之前的cmake,都还没搞清楚有哪些,默认值就在哪儿蒙着头尝试。
实际上在清楚了opencv的最后install安装方式是:

Ubuntu20.04 在anaconda上,opencv-python支持h264编码
这种安装方式说实话,你去指定安装到anaconda的位置,说不定就破坏anaconda自己本身的环境,因为anaconda下有同名文件夹啊。所以安装位置CMAKE_INSTALL_PREFIX不如默认,,,

失败的尝试,留着哈哈。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
官网编译教程
关于cmake的参数配置见官网教程
看着介绍去进行camke的配置。


cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D WITH_GDAL=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_opencv_python2=OFF \
-D CMAKE_INSTALL_PREFIX=$CONDA_PREFIX \
-D PYTHON3_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; import os; print(os.path.join(sysconfig.get_config_var('LIBDIR'), sysconfig.get_config_var('LDLIBRARY')))") \
-D PYTHON3_EXECUTABLE=$(which python) \
-D PYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..

其实编译opencv主要这个参数太多,设置不好就编译make报错,,另外就是各种动态库和依赖的问题

下载没下载成功的包

cmake之后,找找download_with_wget.sh或者download_with_curl.sh,多半有,查看一个会发现:

Ubuntu20.04 在anaconda上,opencv-python支持h264编码

有两个下载没下载好,原因你懂的,尝试了挂代理貌似没啥用,只要手动复制链接下载下来,再去修改对应的文件:
下载文件:ippicv_2020_lnx_intel64_20191018_general.tgz和ade-0.1.1f.zip


md5sum ippicv_2020_lnx_intel64_20191018_general.tgz
7421de0095c7a39162ae13a6098782f9  ippicv_2020_lnx_intel64_20191018_general.tgz
md5sum ade-0.1.1f.zip
b624b995ec9c439cbc2e9e6ee940d3a2  ade-0.1.1f.zip

打开./3rdparty/ippicv/ippicv.cmake文件修改红框内容,md5可能会改,见上面。
下载路径修改为ippicv安装包所在本地路径,注意FILENAME是否和下载的一样,一样的就不管,不然对应修改。注意路径最后还有个/的,别搞漏了。

Ubuntu20.04 在anaconda上,opencv-python支持h264编码
如下:
Ubuntu20.04 在anaconda上,opencv-python支持h264编码
“file:/home/user/Downloads/”
另外的ade-0.1.1f.zip同样类似的操作,修改文件./modules/gapi/cmake/DownloadADE.cmake
然后删除cmake重新cmake

sudo make -j${nproc}

sudo make install

遇到的报错

lib库版本冲突此方案更加稳妥,下面的软链接方案舍弃:


    runtime library [libpng16.so.16] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
      /home/user/anaconda3/lib
    runtime library [libz.so.1] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
      /home/user/anaconda3/lib

既然都警告了,那就粗暴的把 /home/user/anaconda3/lib下libpng16.so.16、libz.so.1备份成libpng16.so.16bp,libz.so.1bp,然后重新cmake,就会没有警告了,,
之后正常编译,安装,最后再把刚刚的备份恢复回来就好。

这样好处在于在编译之前就把cmake的问题都解决了。

软链接方案 舍弃
遇到的报错是/usr/bin/ld: 开头的库报错,一般是找不到,或者几个位置都有,版本不对,anaconda和usr/lib下的版本对应不上,解决方案是通过备份anaconda下的库,在软链接到usr/lib下的版本,还有千万别反过来,因为有可能导致开机gg,注意这个操作一定每一步都记住,动了什么改了什么,,万一出问题还能复原
比如Ubuntu clean … files,… blocks
这个时候就需要去恢复模式改回来,,,,,我最后是忘记我做了啥操作了,遇到这个问题,只能强制将usr/lib下的backup恢复成原来的,把anaconda给禁用了,.bashrc全给注释掉,,,。

举例,慎重操作,记住操作了啥,把谁改软链接了!:

/usr/bin/ld: /home/user/anaconda3/lib/libpangoft2-1.0.so.0: undefined reference to `pango_font_family_get_face'

即报错是anaconda下,那就把usr/lib的链接过来到Anconada下,报错usr/lib下,就把Anconada的链接到usr/lib下

通过locate查看libpangoft2-1.0.so.0在哪些位置
locate libpangoft2-1.0.so.0
输出(多余的删掉没写出来):
/home/user/anaconda3/lib/libpangoft2-1.0.so.0
/home/user/anaconda3/lib/libpangoft2-1.0.so.0.4503.0
/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0
/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0.4400.7
可以看到,/home/user/anaconda3/lib/和/usr/lib/下的版本不对应。
第一步:
anaconda3下的.so备份以下
cd /home/user/anaconda3/lib
sudo mv libpangoft2-1.0.so.0 libpangoft2-1.0.so.0backup
sudo mv libpangoft2-1.0.so.0.4503.0 libpangoft2-1.0.so.0.4503.0backup
第二步,将/usr/lib下的版本软链接到anaconda下:
sudo ln -s /usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 libpangoft2-1.0.so.0
sudo ln -s /usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0.4400.7 libpangoft2-1.0.so.0.4400.7
完事,如果没动依赖,可以继续make......动了依赖啥的,最好删除从新cmake在make

编译安装之后报错
安装之后一台正常,一台报错
Video from IP camera can’t find starting number cv::icvExtractPattern
原因安装时缺乏一些依赖包,实际上make过程有打印提示,已将依赖添加在开头

ffmpeg异常
ffmpeg用apt安装显示一些包不匹配,我解决是把之前自己编译安装的文件删除干净

安装opencv_contrib

下面是尝试安装opencv_contrib,有需要可以装


cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$CONDA_PREFIX \
-D WITH_FFMPEG=ON \
-D BUILD_TIFF=ON \
-D WITH_IPP=ON \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_python2=OFF \
-D WITH_GSTREAMER=ON \
-D WITH_GTK=ON\
-D WITH_GTK_2_X=ON \
-D WITH_OPENCL=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=/xxxxxxxxxxxx/opencv_contrib-4.5.3/modules \
-D OPENCV_ENABLE_NONFREE=ON \
-D PYTHON3_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; import os; print(os.path.join(sysconfig.get_config_var('LIBDIR'), sysconfig.get_config_var('LDLIBRARY')))") \
-D PYTHON3_EXECUTABLE=$(which python) \
-D PYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..

sudo make -j${nproc}

sudo make install

后续遇到的奇葩问题

后续imread、imwrite居然无法使用,但是vdeocaptue可以拉流,可以保存h264编码,一脸懵逼。
只好把编译的卸掉,正常pip install opencv-python ,结果,,,出现imread老是出这个警告而且还无法ctrl+c,郁闷了,

QObject::moveToThread: Current thread (0x55c9b9d98c60) is not the object's thread (0x55c9b9988490).

非常多类似行,,,

一查吓一跳,以下:

Ubuntu20.04 在anaconda上,opencv-python支持h264编码
看完就猜想会不会之前编译opencv遗留了对lib软链接的操作导致的?或者anaconda里遗留了部分libraries,然后直接pip装也来了部分,然后用pip编译安装哈哈,最后没问题了
pip install --no-binary opencv-python opencv-python

这是在opencv编译安装的基础上在进行pip的安装,感觉是负负得正了,应该是冥冥之中把动态库和libraries等给搞正确了,也许还需要反过来操作,最好ldconfig更新动态连接库或者重启下电脑,反正最后就成了,,
我也尝试了卸载opencv的编译之后,单独用pip编译安装,最后有报错:

Traceback (most recent call last):
  File "ceshi.py", line 1, in <module>
    import cv2
  File "/home/user/.local/lib/python3.8/site-packages/cv2/__init__.py", line 5, in <module>
    from .cv2 import *
ImportError: /home/user/mysoft/anaconda3/bin/../lib/libgio-2.0.so.0: undefined symbol: g_uri_join

lib库冲突,可以将anaconda/lib下的libgio-2.0.so 所有相关 软链接到 usr/lib/x86…下面对应的就好了,试了就好了,,,
不管怎么样,如果真想恢复最初,应该是要将之前的lib软链接操作全部复原。这就是之前说的为啥要保留步骤,不然万一出问题你很难还原了。

继续上个问题的后续

哎,opencv的python版本四个,当然常见前三个,opencv-python-headless opencv-python opencv-contrib-python opencv-contrib-python-headless
opencv-python 是只包含了主要模块的包,opencv-contrib-python包含了主要模块以及扩展模块,扩展模块主要是包含了一些带专利的收费算法(如shift特征检测)以及一些在测试的新的算法(稳定后会合并到主要模块)。
带headless的 不包含任何gui功能。它体积较小,适用于更受限制的环境,比如imshow你就用不了。
后面我装albumentations 它依赖opencv-python-headless,自动给我装上了,这我就懵逼了,好不容易微妙的平衡被打破,gg,刚装好的opencv又崩了。所有思路是我提前把opencv-python-headless,opencv-python都装上,这样就不会自动装依赖了。
最后尝试方案是:

所有卸载,编译安装opencv带opencv-contrib支持ffmpeg的python3,
然后pip编译安装opencv-python-headless,在然后pio编译安装 opencv-python。
最后在pip编译安装 albumentations
不想pip 编译安装?报错:
ModuleNotFoundError: No module named 'qudida'
有问题,还是不行继续尝试。

为啥不先opencv-python在opencv-python-headless,因为我试了,opencv-python-headless把opencv-python编译好的又给破坏了,,,

最后,albumentations还是报错找不到某个组件,但是opencv-python正常使用,h264支持,总之暂时没找到解决方案

动态库文件管理

以上挺折腾的,最后我在想:
如果一开始我装好了ffmpeg,conda在装好openh264,再用pip编译安装opencv,会不会就可以支持h264呢,万一人家pip编译的时候是发现安装有ffmpeg就默认支持ffmpeg,或者链接到了openh264?可惜我两台Ubuntu都被污染过了,下回有机会拿到新的在试试这个思路。
装ffmpeg在pip编译opencv不行,下回加上openh264在试试
以上两个尝试都不行,,

新的问题

在一台服务器上卸载干净opencv之后,pip正常安装opencv-python,一定要求加–user,最后导致的情况是,原先用sudo加具体路径的python具体无法运行了。

echo "xxx" | sudo -S /home/xxx/mysoft/anaconda3/bin/python xxx.py

具体原因用sudo which python 发现是链接到usr/bin/python了。
觉得可能是之前编译,要么是其本身编译替换了什么,要么是我修改了的动态库软链接有的还没修改回来。
其实我也不清楚,明明安装在普通用户下的anaconda,居然可以加sudo运行。
而在编译之后,修复会正常的环境,却又无法运行了。
最后既然找不到我就用su去root权限下,用anaconda下的conda init bash了一些,在root下的.bashrc添加了普通用户下的anaconda的环境变量。然后在su下,确实进入到了anaconda的环境下,结果依然有问题,opencv-python依然找不到,其他比如torch能找到。但是普通用户下用pip list是可以看到的。这就奇了怪了,因为时间原因没有深究,我直接在su下用pip重新把opencv相关安装了一遍,然后警告:

WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

自然是无视,,我估计是覆盖安装了,,,
不管怎么样,这之后在su下opencv相关又能找得到了,终于正常了。

另外一台电脑当时没反应过来,而且需要opencv-python至此h264,最后采用的这个方案解决权限问题,粗暴直接
后面发现无论是环境装在普通下还是root下,其实都有办法解决,不过建议最稳定,完整的环境装在root下,其他用户的环境可以当作测试一类用,和root用户下的也就隔开了。

总结

第一是编译要弄清楚装了哪些,装哪儿了,类似opencv的配置输出就很清楚,而且安装文件路径都告诉你了,一开始没看,导致把安装位置防止和anaconda一起,导致覆盖了anaconda某些环境,也许正是这样,才出现了编译之后anaconda下python突然管理员权限运行出现各种问题,比如找不到包。。。
基本上编译注意一是需要什么依赖,安装了什么,安装位置在哪儿,也就无伤大雅了。

参考
https://vitux.com/opencv_ubuntu/
https://blog.csdn.net/GungnirsPledge/article/details/108597474
https://www.jianshu.com/p/26dd452a362e

Original: https://blog.csdn.net/weixin_44359953/article/details/120570857
Author: Tombon
Title: Ubuntu20.04 在anaconda上,opencv-python支持h264编码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/771362/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球