5

语境:

我一直在玩 python 的 opencv2 包装器。我想尝试一些想法,并使用类似于汽车中的“后视”摄像头的广角摄像头。我从一辆报废的撞车上得到一个(它有 4 根电线)我从电线颜色编码中得到了一个有根据的猜测,将它连接起来,以便我从 A 型 USB 为电源线和地线供电,并从一个 RCA 连接器。我买了一个像这样的 NTSC 到 USB 转换器。

它带有驱动程序和一些现成的 VHStoDVD 软件。

问题:

我使用在线磨机示例进行试验测试,如下所示:

import numpy as np
import cv2

cam_index=0
cap=cv2.VideoCapture(cam_index)


print cap.isOpened()
ret, frame=cap.read()

#print frame.shape[0]
#print frame.shape[1]

while (cap.isOpened()):
    ret, frame=cap.read()
    #gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)


    cv2.imshow('frame', frame)


    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#release and close 
cap.release()
cv2.destroyAllWindows() 

这是shell的输出:

True

Traceback (most recent call last):
  File "C:/../cam_capture_.py", line 19, in <module>
    cv2.imshow('frame', frame)
error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:261: error: (-215) size.width>0 && size.height>0 in function cv::imshow

>>> 

主要意见:

截图

  1. 在控制面板中,USB 加密狗在声音视频和游戏控制器中显示为“OEM 捕获”。因此,它不被视为“成像设备”中的简单即插即用网络摄像头

  2. 如果我打开 VHStoDVD 软件我需要配置 2 个方面:

    • 设置为复合
    • 将编码设置为 NTSC,然后在 VHStoDVD 应用程序中显示来自模拟摄像机的摄像机输入正常
  3. 当我在 FLV(设备捕获)中打开设备视频通道时。设备流只是黑屏,但如果我在 flv 流式传输时打开 VHStoDVD 软件,我会在 FLV 上流式传输相机的提要,并且 VHStoDVD 提要上显示黑屏。另一个重要的区别是,与在 VHStoDVD 中运行相比,当提要在 FLV 中时存在大约 0.5 秒的巨大延迟。

  4. 在运行时按照上面的示例代码运行“cam_capture.py”时,我最终会得到一个停止错误代码 0x0000008e:

细节:

stop: 0x0000008E (0xC0000005, 0xB8B5F417, 0X9DC979F4, 0X00000000 )

ks.sys - Address B8B5F417 base at B8B5900, Datestamp...

beg mem dump
phy mem dump complete

5.如果我尝试打印 frame.shape[0] 或 frame.shape[1] 我得到一个类型错误说我不能打印类型 None

6.如果尝试其他 cam_index 结果总是假的

TLDR:

在“控制面板”中,相机设备位于“声音视频和游戏控制器”下方,而不是“成像设备”下方;

cam_index==零;

capture.isOpened()=True;

帧大小为无;

如果 VHStoDVD 以复合 NTSC 配置运行,则相机可以正常工作,显然您无法在附件中看到带有打印屏幕的图像,但请相信我!;)

是否有任何形式的初始化与加密狗的通信可以解决这个问题,即模拟 VHStoDVD 设置(复合 + NTSC)?我以为我可以在 VHStoDVD 和加密狗之间开始通信,但感觉就像我正在做一些我认为是关键转折解决方案的事情。

欢迎任何建设性的见解、建议、更正!

谢谢

干杯

4

3 回答 3

6

好的,所以经过更深入的调查,最初的怀疑得到了证实,即因为 NTSC 加密狗没有作为成像设备处理(它被视为视频控制器,因此类似于电视调谐器卡的仿真),这意味着虽然我们能够使用 cam_index=0 调用 cv2.VideoCapture 视频通道本身不传输,因为我们需要定义一堆参数

  1. 编码
  2. 帧大小
  3. fps 速率等

问题是因为该设备不受支持,因为调用 cv2.VideoCapture.set(parameter, value) 的成像设备似乎并没有改变原始视频源上的任何内容。

我没有找到解决方案,但我找到了解决方法。网上好像有很多选择。搜索关键字 DV 到​​网络摄像头或摄像机作为网络摄像头。

我使用了 DVdriver(http://www.trackerpod.com/TCamWeb/download.htm)(我使用了试用版,因为我很便宜!)。

为什么它有效?

据我所知,DVdriver 从设置为视频控制器的设备接收数据(类似于从“Windows Movie Maker”或 ffmpeg 捕获的数据),然后通过“fairydust”输出 cam_index=0 上的帧(假设没有其他凸轮连接)作为“成像设备”网络摄像头。

概括

TLDR 使用 DVdriver 或类似的。

我找到了一种解决方法,但我真的很想从第一原理中理解它,并可能从 python 中生成 NTSC 加密狗的类似初始化,没有任何其他软件依赖,但在那之前,希望这将有助于其他也在努力或假设它的人是硬件问题。

我现在给你留一些贝克特:曾经尝试过。曾经失败过。不管。再试一次。再次失败。失败更好。(!)

于 2014-03-04T21:44:36.833 回答
1

晚了几个月,但可能有用。我正在使用 Windows 计算机并安装了设备随附的驱动程序,我使用 Somagic 的 Ezcap 尝试了与您的问题相同的代码并得到了相同的错误。由于“frame is None”,我决定尝试围绕它使用 if 语句——以防它是初始化错误。放入循环:

if frame is None:
    print 0
else:
    print 1

结果是:01110111111111111111111111111...

如果 frame = cap.read(),则循环上方被注释掉 - 我得到:00111111111111111 ...

因此,对于我的设备捕获设备,它似乎适用于捕获第 5 帧之后的所有帧。我不确定为什么会这样,但现在它可能是一个有用的解决方法。

免责声明:不幸的是,我的相机输入当前处于辐射场中,因此我无法在几周内找到它以确保它可以正常工作。但是,图像当前是黑框(没有正确输入的情况下预计会出现这种情况)。

于 2014-07-29T19:40:54.500 回答
0

我遇到了同样的问题。作为一种解决方法,我首先尝试了@user3380927 提出的解决方案,它确实有效。但由于我不想依赖外部软件,我开始在 Python 中使用 opencv 调整参数。

这行代码就像一个魅力(你必须在第一次阅读框架之前插入它们):

cam.set(cv2.CAP_FFMPEG,True)
cam.set(cv2.CAP_PROP_FPS,30)

因此,基本相机读取的完整代码如下:

import cv2

cam = cv2.VideoCapture(1)
cam.set(cv2.CAP_FFMPEG,True)
cam.set(cv2.CAP_PROP_FPS,30)

while(True):
    ret,frame = cam.read()
    cv2.imshow('frame',frame)
    if (cv2.waitKey(1) & 0xFF == ord('q')):
        break

cam.release()
cv2.destroyAllWindows()

然后,您可以照常应用图像处理操作。仅供参考,这是我的配置:

  • Opencv 3.1.0
  • Python 2.7.5
  • 视窗 8.1
  • Elgato Video Capture 设备(这也显示为声音视频和游戏控制器)
于 2016-06-09T21:15:43.107 回答