ctypes错误:libdc1394错误:初始化libdc1394失败。

69

我正在尝试将我的程序编译为共享库,以便可以使用ctypes在Python代码中调用。

使用以下命令可以成功编译该库:

g++ -shared -Wl,-soname,mylib -O3 -o mylib.so -fPIC [files] `pkg-config --libs --cflags opencv`

但是,当我尝试使用ctypes导入它时

from ctypes import *
mylib = CDLL("/path/to/mylib.so")
print mylib.test() // Expected output: Hello World

我遇到了以下错误:

libdc1394 error: Failed to initialize libdc1394

发生了什么?

7个回答

188

非常令人沮丧,没有人真正给出具体的解决方案。我在安装OpenCV后遇到了这个问题。对于我来说,最简单的解决方法实际上是禁用这个驱动程序:

sudo ln /dev/null /dev/raw1394

1
这就是你要找的答案 - 如果你不使用硬件而是使用CV2! - Fight Fire With Fire
3
在Debian系统上,这个解决方案似乎不是永久性的。重启后,链接会消失。如何使其永久性? - Christian
3
我猜要使其永久化,只需在/etc/rc.local中的exit 0行之前添加ln /dev/null /dev/raw1394即可。 - lucaferrario
1
运行得非常好!在AWS上安装caffe时遇到了一些麻烦。你救了我一命。 - Yonatan Simson
1
使用OpenALPR的"alpr"命令行时遇到相同问题。使用此解决方案后问题已解决;无论如何,在该线程中为什么会出现这种情况并不清楚。 - Diego Andrés Díaz Espinoza
显示剩余2条评论

31

libdc1394是控制相机硬件的库。我猜它与您提供的opencv一起使用。也许内核驱动程序没有加载?我想有很多原因可能导致它失败。

也许一些OpenCV专家可以更好地回答。但我打赌问题在OpenCV lib那边。

对于相同错误信息的一些初始搜索,得到了相同的原因[1, 2]。因此,如果您在文件系统上找不到/dev/raw1394,请尝试这些方法。

更新:

看起来这只是一个警告。模块raw1394似乎已被弃用,某些libdc1394版本可能正在寻找它,而它随着更新而消失了。搜索它会得到许多结果和错误报告。但是似乎软件应该可以正常运行。因此,如果您真的不需要它,可以忽略它。[3, 4]


1
我们不需要使用相机硬件,也许有一种方法可以在不包含OpenCV的相机部分的情况下进行编译吗? - fredley
/dev/raw1394 的修复似乎没有生效,我从 modprobe 得到了 FATAL: Module raw1394 not found. 的错误提示。 - fredley
4
我看到这个问题是在虚拟机(使用VMWare Fusion Ubuntu 14.04 Django Stack from Bitnami)上运行时出现的,因为它没有安装USB控制器。当我在虚拟机上添加了一个USB控制器后,这个错误消失了。 - goran
与@goran类似,我看到这个在运行VM - VirtualBox 4.3.28上运行CoreOS 647.0.0,其中运行Docker 1.5.0和Fedora 21映像。错误出现在Fedora映像中的>>> import cv2 - kdbanman
似乎这只是一个警告。这确实是我错过的。我只是假设导入没有起作用,但如果我忽略它并继续进行,一切都能正常工作。也许可以将这部分加粗显示在您的答案中? - Arthur Tacca
1
@ArthurTacca 我已经编辑了这个答案,以使其更突出地表明可以安全地忽略。最后一次编辑是在2012年,当时这个发现还没有那么确定。 - luk32

9

好的。我花了整整一天的时间。

基本上,/dev/raw1394/dev/null之间的链接并不是永久的。您可以进入虚拟机,调用ln /dev/null /dev/raw1394,但它只会持续到您重新启动容器为止。

我必须做的事情是,在容器启动期间建立链接,这似乎是最简单但不完美的方法。

我考虑将其作为服务运行,但对于一个简单的工作来说似乎太多了。

我最终找到的方法(它不太美观,但有效),是通过更改Dockerfile的CMD

CMD sh -c 'ln -s /dev/null /dev/raw1394'; <your-script-here>


或者,您可以添加RUN echo 'ln /dev/null /dev/raw1394' >> ~/.bashrc并保持CMD不变。 - Paglian

6

我在VirtualBox中运行的Ubuntu precise也遇到了类似的问题。 首先,我按照这些说明安装了OpenCV:https://help.ubuntu.com/community/OpenCV 这解决了我尝试其他方法时遇到的一些问题,但libdc1394的问题仍然存在。

libdc1394 error: Failed to initialize libdc1394

我终于看到了 goran先前的回答中的评论。

所以我在虚拟机中启用了USB控制器... 很棒!一切都完美地运行了!

谢谢goran!


3
这应该是一条评论,而不是另外一个回答。 - paisanco
1
当我回答这篇帖子时,我还没有注册,现在我已经注册了,但是我没有足够的声望将此消息移动到评论中,很抱歉。 - jeremie
@jeremie 我正在使用Virtual Box,上面运行着Ubuntu 14.04,USB控制器已启用,但我仍然收到相同的消息 - libdc1394错误:无法初始化libdc1394。我正在运行一个Docker容器,其中安装了OpenCV。 - kkk

4

如果您自己编译了opencv并遇到了这个错误,并且不需要firewire视频捕获支持,您可以始终使用-D WITH_1394=OFF选项重新编译,如下所示:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_1394=OFF ./

如果关闭此选项,甚至可以避免依赖于libdc1394-22-dev(Ubuntu)的丢失。虽然我个人没有测试过。

3

在使用Docker镜像时的另一种解决方法是挂载卷。

docker run -v /dev/null:/dev/raw1394


这是如何以及为什么能够工作的?这会让我能够使用网络摄像头吗? - Rohit Shinde

0
我遇到了同样的问题。通过先运行tsu,然后再运行debian来解决。
问题:
./start-debian.sh
root@localhost:~# python3 -c "import cv2; print(cv2.__version__)"
libdc1394 error: Failed to create juju: opendir: Permission denied
libdc1394 error: Failed to initialize libdc1394
3.2.0
root@localhost:~#

tsu
./start-debian.sh
root@localhost:~# python3 -c "import cv2; print(cv2.__version__)"
3.2.0
root@localhost:~# 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接