我有一个从摄像机读取的程序,并找到所有帧的最大颜色强度。我注意到当我将激光指示器划过相机观察区域时会出现虚线效应。
我认为这是因为相机的fps小于相机的快门速度。或者waitkey功能阻止相机在此期间读取。
有没有办法去除这种效果,这样如果我在相机视图上划出一个激光指针,它会留下一条连续线?
编辑:如果可能的话,我也需要实时的结果。
以下是简化代码:
while 1:
ret, view = vid.read()
outputImg = processImage(view)
cv2.waitkey(1)
imshow(outputImg)
答案 0 :(得分:0)
您应该先尝试保存视频,然后再处理。
while 1:
ret, view = vid.read()
outputImg = processImage(view)
cv2.waitkey(1)
imshow(outputImg)
您的代码会捕获一个帧,然后使用您的processImage
函数对其进行处理,然后在cv2.waitkey(1)
中等待,然后显示已处理的帧,最后再次读取下一帧。因此,在读取两帧之间存在时间间隔。您可以像这样保存:
while 1:
ret, frame = vid.read()
out.write(frame)
答案 1 :(得分:0)
虽然shiva's建议可能会改善您的结果,但它仍然是不可预测的,并且行为将在很大程度上取决于相机的功能和您控制它的能力。我希望存在差距。
相反,我会尝试纠正这个:
如果由于某种原因你无法进行插值,但仍需要能够近乎实时地进行处理,请考虑将图像采集放入单独的线程中。将此线程设置为高优先级,以最小化帧之间的间隙。
这个帖子将重复:
然后,创建一个处理线程(这也可能是你的主线程),它将从同步队列中获取帧,并进行必要的处理。
为了获得最佳效果,您应该使用能够以“自由运行”模式运行的相机,相机会自动触发,并将数据流发送到计算机进行处理。
这可能无法直接使用OpenCV和常规网络摄像头。一些较低端的工业相机,无论是GigEVision还是USB3型号都可能更合适。 (AVT Manta,Basler Scout等)如果成本超出您的价格范围,您可以在eBay上找到一些优惠。
您很可能需要使用特殊的API来控制相机并获取帧,但其余的处理将使用OpenCV完成。