函数调用在C语言中工作,但在Python中使用OpenCV使用Python访问Prosilica GigE Camera时会出现错误

函数调用在C语言中工作,但在Python中使用OpenCV使用Python访问Prosilica GigE Camera时会出现错误,python,c,opencv,camera,computer-vision,Python,C,Opencv,Camera,Computer Vision,我尝试调试的一般问题是,为什么C程序可以毫无问题地调用函数,但在Python中调用相同的函数时,会导致错误 我试图让Python OpenCV绑定访问AVT GigE GC1360H摄像头使用模块/highgui/src/cap_pvapi.cpp。我会读书 用C语言完美地显示摄像机的画面,但当我尝试 要在Python中读取帧,解释器会出错。使命感 Python中的VideoCapture.open(0)成功地将相机初始化为 Mono8模式,观察ifconfig显示从 照相机我可以使用v4l网络

我尝试调试的一般问题是,为什么C程序可以毫无问题地调用函数,但在Python中调用相同的函数时,会导致错误

我试图让Python OpenCV绑定访问AVT GigE GC1360H摄像头使用模块/highgui/src/cap_pvapi.cpp。我会读书 用C语言完美地显示摄像机的画面,但当我尝试 要在Python中读取帧,解释器会出错。使命感 Python中的VideoCapture.open(0)成功地将相机初始化为 Mono8模式,观察ifconfig显示从 照相机我可以使用v4l网络摄像头运行相同的Python代码 AVT相机的一部分,工作正常。我在上使用OpenCV 2.3.1 Gentoo Linux 3.2.12 x64。下面是我正在运行的Python代码 在Python 2.7.2上:

import cv2

if __name__ == '__main__':
    cv2.namedWindow("Cam", 1)
    capture = cv2.VideoCapture()
    capture.open(0) # This successfully opens the Camera and ifconfig
shows data being transferred
    while True:
        img = capture.read()[1] # This is where it segfaults

        cv2.imshow("Cam", img)
        if cv2.waitKey(10) == 27: break

    cv2.destroyWindow("Cam")
我将gdb连接到Python解释器,并发现它 内部调用PvCaptureQueueFrame()时出现segfaults OpenCV源代码中的CvCaptureCAM_PvAPI::grabFrame()。以下是该方法的输出:

alex@Wassenberg ~ $ gdb python GNU gdb (Gentoo 7.3.1 p2) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". For bug reporting instructions, please see: <http://bugs.gentoo.org/>... Reading symbols from /usr/bin/python...(no debugging symbols found)...done. (gdb) run ./pyview.py Starting program: /usr/bin/python ./pyview.py process 8921 is executing new program: /usr/bin/python2.7 [Thread debugging using libthread_db enabled] [New Thread 0x7fffe3c10700 (LWP 8929)] [New Thread 0x7fffe340f700 (LWP 8930)] [New Thread 0x7fffe2c0e700 (LWP 8931)] [New Thread 0x7fffe240d700 (LWP 8932)] [Thread 0x7fffe240d700 (LWP 8932) exited] [New Thread 0x7fffe240d700 (LWP 8933)] [Thread 0x7fffe240d700 (LWP 8933) exited] [New Thread 0x7fffe240d700 (LWP 8940)] [Thread 0x7fffe240d700 (LWP 8940) exited] [New Thread 0x7fffe240d700 (LWP 8941)] [New Thread 0x7fffe1c0c700 (LWP 8942)] [New Thread 0x7fffe0eb9700 (LWP 8948)] [New Thread 0x7fffdbfff700 (LWP 8949)]

Program received signal SIGSEGV, Segmentation fault. 0x00007ffff007c8ea in PvCaptureQueueFrame () from /usr/local/lib/libPvAPI.so (gdb) bt
#0  0x00007ffff007c8ea in PvCaptureQueueFrame () from /usr/local/lib/libPvAPI.so
#1  0x00007ffff55dd123 in CvCaptureCAM_PvAPI::grabFrame() () from /usr/lib64/libopencv_highgui.so.2.3
#2  0x00007ffff55dde31 in cvGrabFrame () from /usr/lib64/libopencv_highgui.so.2.3
#3  0x00007ffff55dde4d in cv::VideoCapture::grab() () from /usr/lib64/libopencv_highgui.so.2.3
#4  0x00007ffff55ddaf2 in cv::VideoCapture::read(cv::Mat&) () from /usr/lib64/libopencv_highgui.so.2.3
#5  0x00007ffff6b355c5 in ?? () from /usr/lib64/python2.7/site-packages/cv2.so
#6  0x00007ffff7afdfdc in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#7  0x00007ffff7aff88d in PyEval_EvalCodeEx () from /usr/lib64/libpython2.7.so.1.0
#8  0x00007ffff7aff9a2 in PyEval_EvalCode () from /usr/lib64/libpython2.7.so.1.0
#9  0x00007ffff7b19afc in ?? () from /usr/lib64/libpython2.7.so.1.0
#10 0x00007ffff7b1a930 in PyRun_FileExFlags () from /usr/lib64/libpython2.7.so.1.0
#11 0x00007ffff7b1b50f in PyRun_SimpleFileExFlags () from /usr/lib64/libpython2.7.so.1.0
#12 0x00007ffff7b2c823 in Py_Main () from /usr/lib64/libpython2.7.so.1.0
#13 0x00007ffff74902ad in __libc_start_main () from /lib64/libc.so.6
#14 0x00000000004008a9 in _start () (gdb)
alex@Wassenberg$GDB Python GNU GDB(GUTOO7.3.1P2)7.3.1版权(C)2011免费软件基金会,公司许可证GPLV3+:GNU GPL版本3或更高版本:这是免费软件:您可以自由地改变和重新分配它。在法律允许的范围内,不存在任何担保。有关详细信息,请键入“显示复制”和“显示保修”。此GDB配置为“x86_64-pc-linux-gnu”。有关错误报告说明,请参阅:。。。正在从/usr/bin/python读取符号…(未找到调试符号)…完成。(gdb)运行./pyview.py启动程序:/usr/bin/python./pyview.py进程8921正在执行新程序:/usr/bin/python2.7[使用libthread_db启用线程调试][新线程0x7fffe3c10700(LWP 8929)][新线程0x7fffe340f700(LWP 8930)][新线程0x7fffe2c0e700(LWP 8931)][新线程0x7fffe240d700(LWP 8932)][线程0x7fffe240d700(LWP 8932)退出][新线程0x7fffe240d700(LWP 8933)][线程0x7fffe240d700(LWP 8933)退出][新线程0x7fffe240d700(LWP 8940)][线程0x7fffe240d700(LWP 8940)退出][新线程0x7fffe240d700(LWP 8941)][新线程0x7FFFE1C0C0C700(LWP 8942)][新线程0x7fffe0eb9700(LWP 8948[新线程0x7FFFFFFFF700](LWP 8949)]
程序从/usr/local/lib/libPvAPI.so(gdb)bt接收到PvCaptureQueueFrame()中的信号SIGSEGV,分段错误.0x00007ffff007c8ea
#来自/usr/local/lib/libPvAPI.so的PvCaptureQueueFrame()中的0 0x00007ffff007c8ea
#1 0x00007FF55DD123,位于/usr/lib64/libopencv_highgui.so.2.3中的CvCaptureCAM_PvAPI::grabFrame()
#来自/usr/lib64/libopencv_highgui.so.2.3的cvGrabFrame()中的2 0x00007ffff55dde31
#3/usr/lib64/libopencv_highgui.so.2.3中的cv::VideoCapture::grab()()中的0x00007ffff55dde4d
#4 0x00007ffff55ddaf2,位于/usr/lib64/libopencv_highgui.so.2.3的cv::VideoCapture::read(cv::Mat&)()中
#来自/usr/lib64/python2.7/site-packages/cv2.so的5 0x00007ff6b355c5英寸
#来自/usr/lib64/libpython2.7.so.1.0的PyEval_EvalFrameEx()中的6 0x00007ffff7afdfdc
#来自/usr/lib64/libpython2.7.so.1.0的PyEval_evalcodex()中的7 0x00007ff7aff88d
#来自/usr/lib64/libpython2.7.so.1.0的PyEval_EvalCode()中的8 0x00007ff7aff9a2
#9 0x00007FF7B19AFC in???来自/usr/lib64/libpython2.7.so.1.0
#来自/usr/lib64/libpython2.7.so.1.0的PyRun_FileExFlags()中的10 0x00007ff7b1a930
#来自/usr/lib64/libpython2.7.so.1.0的PyRun_SimpleFileExFlags()中的11 0x00007ff7b1b50f
#来自/usr/lib64/libpython2.7.so.1.0的Py_Main()中的12 0x00007ff7b2c823
#13 0x00007FF74902AD位于/lib64/libc.so.6中的
#14 0x00000000004008a9 in_start()(gdb)
如果能深入了解这个问题,我们将不胜感激。归根结底,这个问题归根结底是为什么C可以毫无问题地调用grabFrame(),除了Python segfaults 问题是生成到C的Python绑定的方式,但我 我不熟悉OpenCV是如何做到这一点的。你知道为什么grabFrame()和PvCaptureQueueFrame()在C语言中可以正常工作,但在Python中却不行吗

以下是能够成功读取AVT摄像机的C程序,供参考:

#include <opencv2/imgproc/imgproc_c.h>
#include "opencv2/highgui/highgui.hpp"
#include <stdio.h>

int main(int argc, char** argv)
{
      printf("Press ESC to exit\n");
      cvNamedWindow( "First Example of PVAPI Integrated", CV_WINDOW_AUTOSIZE );
      CvCapture* capture = cvCreateCameraCapture( CV_CAP_PVAPI );
      assert( capture != NULL );

      IplImage* frame;

      while(1)
      {
            frame = cvQueryFrame(capture);

            if(!frame) break;
            cvShowImage( "First Example of PVAPI Integrated", frame);
            char c = cvWaitKey(50);
            if( c == 27) break;
      }
      cvReleaseCapture( &capture );
      cvDestroyWindow( "First Example of PVAPI Integrated" );
}
#包括
#包括“opencv2/highgui/highgui.hpp”
#包括
int main(int argc,字符**argv)
{
printf(“按ESC退出\n”);
cvNamedWindow(“PVAPI集成的第一个示例”,CV_WINDOW_AUTOSIZE);
CvCapture*capture=cvCreateCameraCapture(CV_CAP_PVAPI);
断言(捕获!=NULL);
IplImage*框架;
而(1)
{
帧=cvQueryFrame(捕获);
如果(!帧)中断;
cvShowImage(“PVAPI集成的第一个示例”,框架);
字符c=cvWaitKey(50);
如果(c==27)断开;
}
cvReleaseCapture(&capture);
CVD窗口(“集成PVAPI的第一个示例”);
}
根据gcc 4.5.3-r2编制:

gcc-I/usr/include/opencv-o main./main.c-lopencv_core -lopencv_imgproc-lopencv_highgui-lopencv_ml-lopencv_视频 -lopencv_特征2D-lopencv_校准3D-lopencv_对象检测 -lopencv_contrib-lopencv_legacy-lopencv_flann


我修复了这个问题,C代码和Python代码之间的唯一区别是传递给cvCreateCameraCapture()的参数(Python中的capture.open())。将0传递给这个函数(就像我在Python中所做的那样)应该使它能够扫描OpenCV支持的任何视频设备,它确实做到了这一点。传递CV_CAP_PVAPI(就像我在C中所做的那样)应将此搜索仅限于Prosilica设备。虽然这些设备的搜索结果应完全相同(它们都找到了相同的摄像头),但传入0时,摄像头未初始化,也未准备好接受队列中的tPvFrames。将800传入capture.open()修复了此问题,因为800是CV_CAP_PVAPI的值