抓取框架ntsctoub加密狗,opencv2,python wrapp

2024-06-25 23:56:12 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:

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

>>> 

主要观察结果:

SCREENSHOTS

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

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

    • 设置为复合
    • 将编码设置为NTSC 在VHStoDVD应用程序中,来自模拟摄像机的摄像机馈送显示正常
  3. 当我在FLV(设备捕获)中打开设备视频通道时。设备流只是一个黑屏,但如果我打开VHStoDVD软件,而flv是流,我得到相机的饲料流在flv和一个黑屏显示在VHStoDVD饲料。另一个重要的区别是,当feed在FLV中而不是在VHStoDVD中运行时,有大约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],我会收到一个类型错误,说我无法打印type None

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

TLDR:

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

凸轮分度=零

capture.isOpened()=真

帧大小为无

如果VHStoDVD运行的是配置了复合NTSC的相机,显然你看不到附带printscreen的图像,但相信我!;)

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

任何建设性的见解,建议,更正都是最受欢迎的!

谢谢

干杯


Tags: 视频软件cv2frameusbcapturecapprint
3条回答

好的,经过更深入的调查,最初的怀疑被证实了,也就是说,因为NTSC加密狗不是作为成像设备处理的(它被视为视频控制器,所以类似于电视调谐器卡的模拟),这意味着尽管我们可以用cam_index=0调用cv2.VideoCapture,但视频通道本身并没有传输,因为我们需要定义一组参数

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

问题是,该设备不支持作为调用cv2.VideoCapture.set(参数、值)的成像设备,似乎不会更改原始视频源上的任何内容。

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

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

为什么有效?

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

摘要

TLDR使用DVdriver或类似产品。

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

我现在给你留点贝克特: 曾经尝试过。曾经失败过。没关系。再试一次。又失败了。失败得更好。(!)

我也面临同样的问题。作为一种解决方法,我首先尝试了@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版
  • Python2.7.5
  • Windows 8.1版
  • Elgato视频捕获设备(也显示为声音视频和游戏控制器)

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

if frame is None:
    print 0
else:
    print 1

结果是:011111111111111111111111。。。

如果在循环上方的frame=cap.read()被注释掉-我得到:00111111111111。。。

所以对于我的设备捕获设备来说,它似乎在工作,所有超过5帧的帧都被捕获。我不知道这是为什么,但这可能是一个有用的工作目前。

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

相关问题 更多 >