抓取框架 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 包装器的主要内容,如果未能解决你的问题,请参考以下文章