抓取框架 NTSCtoUSB 加密狗,opencv2,python 包装器

Posted

技术标签:

【中文标题】抓取框架 NTSCtoUSB 加密狗,opencv2,python 包装器【英文标题】:grab frame NTSCtoUSB dongle, opencv2, python wrapper 【发布时间】:2014-04-04 11:14:13 【问题描述】:

上下文:

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

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

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

    设置为复合 设置编码为 NTSC 然后在 VHStoDVD 应用程序中显示来自模拟摄像机的摄像机信号正常

    当我在 FLV(设备捕获)中打开设备视频通道时。设备流只是黑屏,但如果我在 flv 流式传输时打开 VHStoDVD 软件,我会在 FLV 上流式传输相机的提要,并且 VHStoDVD 提要上显示黑屏。另一个重要区别是,与在 VHStoDVD 中运行相比,提要在 FLV 中存在大约 0.5 秒的巨大延迟。

    在运行时按照上面的示例代码运行“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],我会收到一个类型错误,说我无法打印无类型

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

TLDR:

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

cam_index==零;

capture.isOpened()=True;

帧大小为无;

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

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

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

谢谢

干杯

【问题讨论】:

供参考:xp 2002 sp3 i5 @2.67GHz 2GB RAM 200GB 这个问题与“user3285283”的初始线程非常相似,但他的问题从未“解决”过。 只是想了解问题 - 你怎么能得到stop:... 错误以及标准回溯错误?似乎您会立即获得回溯并且它不会“运行”..? 这可能是很多故障排除。如果您不介意,请使用this chat。 显然我没有足够的代表来使用聊天,但这里是: 【参考方案1】:

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

    编码 帧大小 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 加密狗的类似初始化,没有任何其他软件依赖项,但在那之前,希望这能帮助其他也在苦苦挣扎的人或假设这是硬件问题。

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

【讨论】:

恭喜您找到解决方法。您还确认它实际上是在使用原始设置在相机上拾取,所以这是一大步。您提到cv2.VideoCapture.set(...) 不起作用,但让我确定......当您使用它时,我很确定您必须在您创建的 VideoCapture 实例上调用它。 IE。 cap = cv2.VideoCapture(..) 后跟 cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 1024)。你已经这样做了吗? 我使用“import cv2.cv as cv”只是为了减少冗长但相同的实现。之前的场景是 1) VHStoDVD 软件捕获相机作为独立应用程序结果:视频输入正常 2) 当 VHStoDVD 处于捕获模式时,同时运行 py 脚本结果:py 脚本“帧”是绿屏 BGR (0,136,0) 和VHStoDVD 提要变成黑屏; 3) 单独运行脚本没有额外的捕获软件结果:停止错误代码0x00000008 现在在场景 2(绿屏)中,当使用 cv.set() 强制新的高度或宽度时,我询问 frame.shape 为 720x576,然后结果始终为 720x576。这个比率是 PAL,我认为这可能是 DONGLE 默认的“配置”。 所以我尝试更改 CV_CAP_PROP_MODE->2 (mode_640x480_YUV422) 意思是强制它进行 NTSC 解码。结果:显示仍然是 720x576 的绿屏。我认为根本问题是可能会有一些在 OPENCV 框架内无法实现的初始化,因为它只能处理“成像设备”,因此需要额外的临时驱动程序,这似乎是 DVdriver 能够做到的背景。 @kobejohn 你认为不使用第三方软件就可以在 python 中实现与 DVdriver 相同的功能吗?即初始化捕获设备的视频源并解析“图像设备”伪网络摄像头供 opencv 框架使用?【参考方案2】:

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

if frame is None:
    print 0
else:
    print 1

结果是:01110111111111111111111111111...

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

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

免责声明:不幸的是,我的摄像头输入当前处于辐射场中,因此我需要几周时间才能确定它是否正常工作。但是,图像当前是黑框(在没有正确输入的情况下预计会出现这种情况)。

【讨论】:

【参考方案3】:

我遇到了同样的问题。作为一种解决方法,我首先尝试了@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 Video Capture 设备(也显示为声音视频和游戏控制器)

【讨论】:

以上是关于抓取框架 NTSCtoUSB 加密狗,opencv2,python 包装器的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv在android中抓取连续帧

Charles抓取加密请求

抖音对指定用用户的所有视频抓取策略

python之OpenCv---抓取摄像头视频图像

大众点评评论抓取-加密评论信息完整抓取

在python3下使用OpenCV 抓取摄像头图像并实时显示3色直方图