抓取帧NTSCTOUB加密狗,opencv2,python包装器 背景:

抓取帧NTSCTOUB加密狗,opencv2,python包装器 背景:,python,opencv,python-2.7,video-capture,analog-digital-converter,Python,Opencv,Python 2.7,Video Capture,Analog Digital Converter,我一直在使用python的opencv2包装器。 我想玩一些想法,使用一个广角摄像头,类似于汽车中的“后视”摄像头。 我从一辆报废的撞车上得到了一个(它有4根电线),我根据电线颜色编码进行了一个有根据的猜测,将其连接起来,以便从usb类型a为电源线和地线供电,并从RCA接头为NTSC复合材料+复合材料供电。 我买了一个NTSC到usb转换器 它附带了驱动程序和一些现成的VHStoDVD软件 问题是: 我使用普通的在线示例对其进行了如下测试: import numpy as np import c

我一直在使用python的opencv2包装器。 我想玩一些想法,使用一个广角摄像头,类似于汽车中的“后视”摄像头。 我从一辆报废的撞车上得到了一个(它有4根电线),我根据电线颜色编码进行了一个有根据的猜测,将其连接起来,以便从usb类型a为电源线和地线供电,并从RCA接头为NTSC复合材料+复合材料供电。 我买了一个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

>>> 
5.如果我尝试打印frame.shape[0]或frame.shape[1],我会收到一个类型错误,表示我无法打印类型None

6.如果尝试其他cam_索引,结果总是错误的

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

cam_指数==零

capture.isopend()=True

帧大小为零

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

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

欢迎提出任何建设性的见解、建议和更正

谢谢


干杯

好的,因此在深入调查后,最初的怀疑得到了确认,即因为NTSC加密狗不是作为成像设备处理的(它被视为视频控制器,非常类似于模拟电视调谐器卡)这意味着,尽管我们可以使用cam_index=0调用cv2.VideoCapture,但视频通道本身并没有传输,因为我们需要定义一组参数

  • 编码
  • 帧大小
  • fps费率等
  • 问题是,该设备不被支持作为调用cv2.VideoCapture.set(参数、值)的成像设备,似乎不会更改原始视频提要上的任何内容

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

    我使用了DVdriver()(我使用试用版是因为我便宜!)

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

    总结 TLDR使用DVdriver或类似产品

    我找到了一个解决方法,但我真的很想从第一原理来理解它,并可能从python内部生成类似的NTSC加密狗初始化,而不需要任何其他软件依赖项,但在此之前,希望这将帮助其他也在挣扎或认为这是硬件问题的人

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

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

    结果是:011011111111111111111

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

    因此,对于我的设备捕获设备,它似乎对捕获的第5帧以外的所有帧都有效。我不确定这是为什么,但现在这可能是一个有用的解决办法


    免责声明:不幸的是,我的相机输入目前处于辐射场中,因此我在几周内无法确定它是否正常工作。然而,这些图像目前是一个黑框(如果没有适当的输入,这是应该的)。

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

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

    因此,基本摄像机读数的完整代码如下:

    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视频捕获设备(也显示为声音视频和游戏控制器)

    供参考:xp 2002 sp3 i5@2.67GHz 2GB RAM 200GB此问题与“user3285283”中的初始线程非常相似,但他的问题从未“解决”过。只是试图理解问题-如何获得
    停止:…
    错误和标准回溯错误?看起来您会立即得到回溯,但它不会“运行”…?这可能需要很多故障排除。如果你不介意,请使用。显然,我没有足够的代表使用聊天,但这里说:祝贺你找到了解决方法。您还确认了它实际上正在使用原始设置拾取相机,这是一大步。您提到
    cv2.VideoCapture.set(…)
    不起作用,但让我确定一下。。。当你使用它时,我很确定你必须在你创建的视频捕获实例上调用它。即
    cap=cv2.VideoCapture(..)
    后接
    cap.set(cv2.cv.cv\u cap\u PROP\u FRAME\u WIDTH,1024)
    if frame is None:
        print 0
    else:
        print 1
    
    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()