抢帧NTSCtoUSB加密狗,opencv2,python包装器

时间:2014-03-03 11:59:43

标签: python opencv python-2.7 video-capture analog-digital-converter

上下文

我一直在使用python的opencv2包装器。 我想玩一些想法,并使用类似于汽车中的“后视”相机的广角相机。 我从一辆报废的碰撞车(它有4根电线)得到一个我从电线颜色编码中得到了一个有根据的猜测,将它连接起来,这样我就从A型A型电源和地线供电并从NTSC复合材料+复合材料中取出一个RCA连接器。 我买了一台NTSC到usb转换器like this one

它带有驱动程序和一些现成的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

>>> 

关键观察:

SCREENSHOTS

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

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

    • 设为复合
    • 将enconding设置为NTSC 然后在VHStoDVD应用程序中显示来自模拟摄像机的摄像机正常显示
  3. 当我在FLV(设备捕获)中打开设备视频通道时。设备流只是一个黑屏,但如果我打开VHStoDVD软件,当flv正在流式传输时,我会将相机的输入信息传输到FLV上,并在VHStoDVD信号源上显示黑屏。另一个重要的区别是,当进给处于FLV而不是运行在VHStoDVD中时,存在大约0.5秒的aprox潜伏期。

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

  5. 细节:

    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],我会收到类型错误,说我无法打印类型无

    6.如果尝试其他cam_index,结果始终为false

    TLDR:

    在“控制面板”中,相机设备处于'声音视频&amp;游戏控制器不在“成像设备”之下;

    cam_index ==零;

    capture.isOpened()= True;

    帧大小为None;

    如果VHStoDVD在配置了复合NTSC的情况下运行,那么显然您无法在附件中看到带有打印屏幕的图像,但请相信我! ;)

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

    非常欢迎任何有建设性的见解,建议和更正!

    由于

    干杯

3 个答案:

答案 0 :(得分:6)

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

  1. 编码
  2. 框架尺寸
  3. fps率等
  4. 问题是因为设备不支持作为调用cv2.VideoCapture.set(参数,值)的成像设备似乎不会改变原始视频源上的任何内容。

    我找不到解决办法,但我找到了解决办法。网上似乎有很多选择。搜索关键字DV to webcam或camcorder作为网络摄像头。

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

    为什么会这样?

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

    摘要

    TLDR使用DVdriver或类似产品。

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

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

答案 1 :(得分:1)

这已经晚了几个月,但可能会有用。我在Windows计算机上工作,并安装了设备附带的驱动程序,我尝试使用来自Somagic的Ezcap的问题代码,并得到了同样的错误。由于“frame is None”,我决定在它周围尝试if语句 - 以防它是初始化错误。放入循环:

if frame is None:
    print 0
else:
    print 1

结果是:01110111111111111111111111111 ...

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

因此,对于我的设备捕获设备,它似乎适用于捕获超过5的所有帧。我不确定为什么会这样,但现在可能是一项有用的工作。

免责声明:不幸的是,我的相机输入目前处于辐射场,因此我无法在几周内完成它以确保其正常工作。但是,图像目前是黑框(预计没有适当的输入)。

答案 2 :(得分: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
  • Windows 8.1
  • Elgato视频捕获设备(这也显示为声音视频和游戏控制器)