我一直在使用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
>>>
在控制面板中,usb加密狗在Sound Video&amp ;;中显示为“OEM捕获”。游戏控制器。因此,它不被视为“成像设备”中的简单即插即用网络摄像头
如果我打开VHStoDVD软件,我需要配置2个方面:
当我在FLV(设备捕获)中打开设备视频通道时。设备流只是一个黑屏,但如果我打开VHStoDVD软件,当flv正在流式传输时,我会将相机的输入信息传输到FLV上,并在VHStoDVD信号源上显示黑屏。另一个重要的区别是,当进给处于FLV而不是运行在VHStoDVD中时,存在大约0.5秒的aprox潜伏期。
在运行期间按照上面的示例代码运行“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,结果始终为false
在“控制面板”中,相机设备处于'声音视频&amp;游戏控制器不在“成像设备”之下;
cam_index ==零;
capture.isOpened()= True;
帧大小为None;
如果VHStoDVD在配置了复合NTSC的情况下运行,那么显然您无法在附件中看到带有打印屏幕的图像,但请相信我! ;)
是否有任何形式的初始化与加密狗的通信开始可以解决这个问题,即模拟VHStoDVD设置(复合+ NTSC)?我以为我可以在VHStoDVD和加密狗之间开始通信,但感觉我已经超越了做一些我认为是关键转弯解决方案的事情。
非常欢迎任何有建设性的见解,建议和更正!
由于
干杯
答案 0 :(得分:6)
好的,经过深入调查后,最初的怀疑得到了确认,即因为NTSC加密狗不作为成像设备处理(它被视为视频控制器,所以类似于电视调谐器卡的仿真),这意味着尽管我们能够通过cam_index = 0调用cv2.VideoCapture视频通道本身没有传输,因为我们需要定义一堆参数
问题是因为设备不支持作为调用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()
然后您可以照常应用图像处理操作。仅供参考,这是我的配置: