首页 > 技术文章 > ubuntu---opencv使用时报错:Rebuild the library with Windows, GTK+ 2.x or Carbon support.

carle-09 2020-02-28 16:17 原文

成功安装完opencv后,使用时报错:Rebuild the library with Windows, GTK+ 2.x or Carbon support.

"""""

Loading weights from ./weights/yolov3.weights...Done!
data/dog.jpg: Predicted in 0.143663 seconds.
dog: 100%
car: 27%
truck: 92%
bicycle: 99%
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.2) /home/jupiter/opencv-3.4.2/modules/highgui/src/window.cpp:615:

error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support.

If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'

"""


如果opencv安装时,WITH_GTK=OFF -D WITH_GTK_2_X=OFF :
#cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.2 -D OPENCV_EXTRA_MODULES_PATH=/home/jupiter/opencv-3.4.2/opencv_contrib-3.4.2/modules -D WITH_GTK=OFF -D WITH_GTK_2_X=OFF ..
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.2 -D OPENCV_EXTRA_MODULES_PATH=/home/jupiter/opencv-3.4.2/opencv_contrib-3.4.2/modules -D WITH_GTK=OFF -D WITH_GTK_2_X=OFF ..


则重装opencv,修改 WITH_GTK=ON -D WITH_GTK_2_X=ON :
#cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.2 -D OPENCV_EXTRA_MODULES_PATH=/home/jupiter/opencv-3.4.2/opencv_contrib-3.4.2/modules -D WITH_GTK=ON -D WITH_GTK_2_X=ON ..
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.2 -D OPENCV_EXTRA_MODULES_PATH=/home/jupiter/opencv-3.4.2/opencv_contrib-3.4.2/modules -D WITH_GTK=ON -D WITH_GTK_2_X=ON ..

#cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.2 -D OPENCV_EXTRA_MODULES_PATH=/home/jupiter/opencv-3.4.2/opencv_contrib-3.4.2/modules -D WITH_GTK=ON -D WITH_GTK_2_X=ON ..

或者简单点:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.2 -D OPENCV_EXTRA_MODULES_PATH=/home/jupiter/opencv-3.4.2/opencv_contrib-3.4.2/modules ..

另外,在pencv安装前,要先安装一些依赖项目:
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential
$ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install ffmpeg #很重要,读视频,显示视频

注意:

自定义的路径:CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.2  ,后续会遇到一些小问题。
推荐,默认路径:CMAKE_INSTALL_PREFIX=/usr/local

 

 @https://www.cnblogs.com/bitbyte/archive/2012/10/28/2744035.html

 

sudo apt-get install libgtk2.0-dev
安装libgtk2.0-dev不顺利的话,可以尝试aptitude的方法解决:
sudo aptitude install libgtk2.0-dev

sudo: aptitude:找不到命令
jupiter@jupiter-Default-string:~$ sudo apt-get install aptitude
网上给出的相关解释:
----------------------------------------------------------- 在网上搜索到有些解决办法是更改软件源(比如https:
//www.cnblogs.com/zeze/p/linux1.html),但是修改完后还是不行。 参考其他博客发现,libgtk2.0-dev依赖得部分库需要一个比较老的版本。所以,这里使用如下命令: sudo aptitude install libgtk2.0-dev 将较新的库降级为满足依赖关系的库,按照提示逐步操作即可。 运行后会出现一大堆消息,给出第一个解决方案一般是保留这些库文件,让选择y/n/q?,这里选择“n”;
然后会继续找解决方案,有时会超时找不到,点击y继续找,直到给出得解决方案是“降级”这些库文件,选择“y”,然后等待结束就完了。 完成后可以再输入“sudo aptitude install libgtk2.
0-dev”进行测试,出现已经安装对应得库文件,说明安装成功了。(此方法同样适用于安装opencv时其他不能正常安装的预备库文件)
-----------------------------------------------------------
原因分析:
出现上述错误是因为目前使用的源的版本比较低,而要安装的软件的依赖的版本的较高,因此方法只能是更换源

这种问题就应该是软件源的问题,源中的版本比较低;依赖的版本号比正要安装的版本号要低导致没法安装。
只需要将原来软件源删除,用新的软件源替换一下就可以了。

sudo gedit /etc/apt/sources.list

deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

写上软件源后,再刷新一下,注意一定要刷新,运行:
sudo apt-get update
尝试了不好使。内核还给顺便升级了,原来 4.15.0-29 升级成了4.15.0-88,导致驱动不好使了。

aptitude 会对依赖关系进行智能处理,aptitude 会重新计算可行方案,包括对已存在的包进行降级等。

pkg-config是一个用来管理包的程序,在控制台输入 pkg-config --cflags --libs gtk+-2.0,可以发现
输出的文本包括了gcc编译gtk+2.0所需要的所有选项(头文件目录和库文件)。 

 

附:

aptitude 与 apt-get

aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具。
与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些。
举例来说,aptitude 在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净。 以下是笔者总结的一些常用 aptitude 命令,仅供参考。 命令作用 aptitude update  更新可用的包列表   aptitude upgrade   升级可用的包   aptitude dist
-upgrade     将系统升级到新的发行版   aptitude install pkgname 安装包   aptitude remove pkgname 删除包   aptitude purge pkgname 删除包及其配置文件   aptitude search string 搜索包   aptitude show pkgname 显示包的详细信息   aptitude clean 删除下载的包文件   aptitude autoclean 仅删除过期的包文件 有的问题 apt-get 解决不了,必须使用 aptitude 解决,有的问题,用 aptitude 解决不了,必须使用apt-get. aptitude 解决得更好的地方: install, remove, reinstall(apt-get无此功能), show(apt-get无此功能), search(apt-get无此功能), hold(apt-get无此功能), unhold(apt-get无此功能), apt-get 解决得更好的地方: source(aptitude无此功能), build-dep (低版本的aptitude没有build-dep功能) apt-get 跟 aptitude 没什么区别的地方:update, upgrade (apt-get upgrade=aptitude safe-upgrade, apt-get dist-upgrade=aptitude full-upgrgade)

@https://www.cnblogs.com/klcf0220/p/10242810.html

 

推荐阅读