无法使用带有 Python 3 的 See3CAM 读取图像并打开 CV

Posted

技术标签:

【中文标题】无法使用带有 Python 3 的 See3CAM 读取图像并打开 CV【英文标题】:Cannot read image with See3CAM with Python 3 and open CV 【发布时间】:2016-01-25 04:56:20 【问题描述】:

我正在尝试使用 Python 3.4 和 OpenCV 从 e-Con Systems 的相机读取图像。相机使用 DirectShow 驱动程序,我可以连接到相机(isOpened 返回 true 并且相机上的状态 LED 处于活动状态)但是当我尝试读取或抓取帧时它不起作用。

import cv2
cam = cv2.VideoCapture(cv2.CAP_DSHOW + device)
cam.isOpened()  # returns true, camera LED on
flag, frame = cam.read() # flag=false, frame=None

我也尝试过像其他人所说的那样捕获多个帧,但仍然没有运气!

【问题讨论】:

请问您使用的是哪款相机以及相机的输出格式? 1.3MP 相机开发板。 www.e-consystems.com/1MP-USB3-Near-IR-Camera.asp 我可以知道您使用的是什么 Opencv 版本以及 Windows 或 Linux 吗? 您的问题解决了吗?如有任何问题,请随时提出! 【参考方案1】:

很久以前,我为 OpenCV 编写了一个补丁,它提供了对 Y16 编解码器的支持,因此您不再需要经历所有这些对 OpenCV 进行自定义编译的痛苦。当时我已经通过电子邮件向 E-con 支持发送了电子邮件,但是(截至发帖时)我看到他们没有尝试调整他们的做事方式。

Brandon Hurr / @bhive01 为 See3CAM_CU40 编写了一些 Python 代码,您可以查看 over here。这与使用 OpenCV 的 VideoCapture 接口的方式非常相似,只需将 'Y','1','6','' 用于 FOURCC 设置,并将 CAP_PROP_CONVERT_RGB 设置为 false。

干杯!

【讨论】:

【参考方案2】:

从相机规格中可以看出,相机输出格式为 Y16,即 16 位单色格式。默认opencv/Direct show不支持这种格式!

为 See3CAM 自定义格式构建 OpenCV

这是构建具有自定义帧格式支持的 OpenCV 的分步过程。

    下载OpenCV 下载修改后的cap_dshow.cpp。

注意:此源代码经过修改,仅支持 Y16 和 BY8 格式。

    选择所需的配置 - 用于构建 x86 或 x64 位库和构建 OpenCV official guide。

    替换现有的 cap_dshow.cpp

我。对于 OpenCV 2.x.x 路径:OpenCV/sources/modules/highgui/src

二。对于 OpenCV 3.x.x 路径:OpenCV/sources/modules/videoio/src

    打开 OpenCV.sln 解决方案文件并构建 OpenCV 库。

这是一个示例 C++ 应用程序,用于以 16 位图像格式流式传输相机。我希望将它移植到 python 非常简单!希望这会有所帮助!

#include "CTimer.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace cv;
using namespace std;

int main( int, char** argv )

    const int iWidth=1280;
    const int iHeight=720;

    CTimer t_FPS;
    t_FPS.Init();

    VideoCapture Capture(0);

    if(!Capture.isOpened())
    
        cout<< "Cannot Open Camera!";
        return 0;
    
    Capture.set(CV_CAP_PROP_FRAME_WIDTH,iWidth);
    Capture.set(CV_CAP_PROP_FRAME_HEIGHT,iHeight);

    namedWindow("Camera NIR Frame",WINDOW_AUTOSIZE);

    Mat mCamFrame_10,mCamFrame_8;

    char key;
    for(;;)
    

        Capture >> mCamFrame_10; // get a new frame from camera

        if(mCamFrame_10.empty()||mCamFrame_10.rows==0||mCamFrame_10.cols==0)
        
            cout<< "Invalid Frame Frame Empty"<<"\n";
            break;
        

        //Convert to 8 Bit: Scale the 10 Bit (1024) Pixels into 8 Bit(256) (256/1024)= 0.25
        convertScaleAbs(mCamFrame_10,mCamFrame_8,0.25);

        imshow("Camera NIR Frame", mCamFrame_8);

        t_FPS.Update();
        cout<<"Frame Rate: "<<t_FPS.GetFPS()<<"\n";
        key = cv::waitKey(1);
        if(key == 27)
        
            //Esc Key is pressed & Exit the Application
            break;
        
    
    waitKey(0);
    return 0;
    // the camera will be deinitialized automatically in VideoCapture destructor

【讨论】:

解决方案文件?我正在使用python。我需要安装 Visual Studio 来编译它吗? 你将如何从源代码构建 opencv?只需按照官方指南构建 opencv 我们设法构建了它,它似乎可以工作并捕获。它返回的图像只是噪音,但是 numpy 数组看起来并不完整。我们正试图找出原因 当我使用 cap.read() 或 grab() 然后检索() 时,设备上的状态 LED 不会像 eCAM 软件那样闪烁。他们都返回一个看起来不正确的numpy数组,这个图像是错误的。我也无法设置()变量(如图像宽度/高度等)>>> for i in range(0, 22): ... cap.get(i) ... -1.0 -1.0 -1.0 640.0 480.0 0.0 540422489.0 -1.0 -1.0 -1.0 1.0 59267632.0 59267632.0 59267632.0 59267632.0 -4.0 -1.0 59267632.0 -1.0 59267632.0 59267632.0 -1.0 你解决过这个问题吗?我刚得到一个 SeeCam40,我想我可以很容易地将它插入 python。如果不使用修改后的 CPP 文件构建 OpenCV,然后使用他们的 C 代码构建应用程序,似乎没有任何方法可以做到这一点。我在 python 中更舒服,并且有工作代码可以对输入图像执行我想要的操作。 @jme

以上是关于无法使用带有 Python 3 的 See3CAM 读取图像并打开 CV的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Windows 10 上安装带有 python 2.7 的 Django 版本 1.11.22

带有 Python 3 的 opencv3,imshow() 不显示图像

无法在 Mac 上创建带有子进程的新控制台

python 3.5 上带有 tkinter 应用程序的 Pyinstaller 问题

无法使用 python 3.5 安装 opencv 3.1,仅适用于 2.7

带有 Pyside2 和 Matplotlib 的 Pyinstaller 无法正常工作