无法使用带有 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() 不显示图像
python 3.5 上带有 tkinter 应用程序的 Pyinstaller 问题