我的配置:
ubuntu 16.04
opencv 3.3.1
gcc version 5.4.0 20160609
ffmpeg version 3.4.2-1~16.04.york0
我用open:
构建了opencvcmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D PYTHON_EXECUTABLE=$(which python) -D OPENCV_EXTRA_MODULES_PATH=/home/xxx/opencv_contrib/modules -D WITH_QT=ON -D WITH_OPENGL=ON -D WITH_IPP=ON -D WITH_OPENNI2=ON -D WITH_V4L=ON -D WITH_FFMPEG=ON -D WITH_GSTREAMER=OFF -D WITH_OPENMP=ON -D WITH_VTK=ON -D BUILD_opencv_java=OFF -D BUILD_opencv_python3=OFF -D WITH_CUDA=ON -D ENABLE_FAST_MATH=1 -D WITH_NVCUVID=ON -D CUDA_FAST_MATH=ON -D BUILD_opencv_cnn_3dobj=OFF -D FORCE_VTK=ON -D WITH_CUBLAS=ON -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" -D WITH_GDAL=ON -D WITH_XINE=ON -D BUILD_EXAMPLES=OFF -D BUILD_DOCS=ON -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D BUILD_opencv_dnn=OFF -D BUILD_PROTOBUF=OFF -D opencv_dnn_BUILD_TORCH_IMPORTER=OFF -D opencv_dnn_PERF_CAFFE=OFF -D opencv_dnn_PERF_CLCAFFE=OFF -DBUILD_opencv_dnn_modern=OFF -D CUDA_ARCH_BIN=6.1 ..
并使用这些python代码来阅读和显示:
import cv2
from com.xxx.cv.core.Image import Image
capture=cv2.VideoCapture("rtsp://192.168.10.184:554/mpeg4?username=xxx&password=yyy")
while True:
grabbed,content=capture.read()
if grabbed:
Image(content).show()
doSomething()
else:
print "nothing grabbed.."
每次阅读大约50帧后,都会出现如下错误:
[h264 @ 0x8f915e0] error while decoding MB 53 20, bytestream -7
然后没有什么可以被进一步抓住,奇怪的是:
1,comment doSomething() or
2,keep doSomething() and recording the stream from same IPCamera,then run
code against recorded video
这两种情况,代码工作正常,谁能告诉如何解决这个问题?提前感谢!
答案 0 :(得分:3)
首先让我们看一个用于读取RTSP的简单示例程序
import cv2
cap=cv2.VideoCapture("rtsp://admin:admin_123@172.0.0.0")
ret,frame = cap.read()
while ret:
ret,frame = cap.read()
cv2.imshow("frame",frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
cap.release()
帧值是每帧的图像。但是,如果您在while代码块中为每个帧添加了识别操作,例如添加Tensorflow来识别其中的小动物,则会报告此错误,并且由于该异常而将while循环中断。
[h264 @ 0x55abeda05080] left block unavailable for requested intra mode
[h264 @ 0x55abeda05080] error while decoding MB 0 14, bytestream 104435
事实证明, FFMPEG Lib不支持rtsp协议中的H264视频,因此解决方案是编写两个不同的线程分别处理每个帧的图像,然后再编写另一个线程来处理每帧的图像。
想法如下:使用队列,采用先进先出策略,开始在一个线程中接收数据,并在另一个线程中逐帧处理数据
解决方案代码如下:
import cv2
import queue
import time
import threading
q=queue.Queue()
def Receive():
print("start Reveive")
cap = cv2.VideoCapture("rtsp://admin:admin_123@172.0.0.0")
ret, frame = cap.read()
q.put(frame)
while ret:
ret, frame = cap.read()
q.put(frame)
def Display():
print("Start Displaying")
while True:
if q.empty() !=True:
frame=q.get()
cv2.imshow("frame1", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
if __name__=='__main__':
p1=threading.Thread(target=Receive)
p2 = threading.Thread(target=Display)
p1.start()
p2.start()
Receive用作接收数据的线程,而Display则显示为一个简单的过程。
答案 1 :(得分:1)
我遇到了这个问题,我现在就解决了。
(注意:我使用的是python3)
我怀疑它与时序有关,因为在连续capture.read()
之间进行昂贵的操作时会出现错误。你的问题让我确定了这一点。
此外,当我从网络摄像机(使用H264编码)流式传输时出现问题,使用笔记本电脑相机时没有问题。
所以对我有用的解决方案是使用多线程,使用python" threading"模块。一个线程流和其他进程,同时正确管理线程锁,因此不会发生读/写冲突。
答案 2 :(得分:0)
经过4天的研究,我遇到了同样的问题,最后我通过这段代码轻松解决了问题:只需尝试一次
library(data.table)
setDT(mydata)
mydata[, sum(p, na.rm = T), .(years, area)]
答案 3 :(得分:0)
这仅适用于视频流:
您要做的就是如果返回False,则再次初始化cv2.VideoCapture。 :)
为我工作。
vs = cv2.VideoCapture("rtsp://bla:bla@192.168.x.x")
while True:
ret,frame = vs.read()
if not(ret):
st = time.time()
vs = cv2.VideoCapture("rtsp://bla:bla@192.168.x.x")
print("tot time lost due to reinitialization : ",time.time()-st)
continue
cv2.imshow("Current frame", frame)
cv2.waitKey(0)
答案 4 :(得分:0)
我在具有ubuntu 16.04的系统上使用带有opencv 3.4和python3的hikvision ip poe摄像机。 相机正在以h264格式流式传输。
使用RTSP时,我使用opencv的视频捕获从摄像机进行流式传输,有时我遇到相同的问题“在解码MB 43 20字节流-4时出现[[h264 @ 0x8f915e0]错误]
当您在进一步处理中使用捕获的帧并在rtsp仍在流式传输时在管道中创建延迟时,会产生此问题。
解决方案是将捕获内容放到另一个线程上,将您使用的帧放到另一个线程上。
在使用python的多线程的同一过程中,您将拥有类似的东西:
#thread1
global frame
frame = None
cap = cv2.VideoCapture("rtsp://bla:bla@192.168.x.x")
while True:
ret,frame = cap.read()
#thread2
cv2.imshow("Current frame", frame)
cv2.waitKey(0)
# you can pass now the frame to your application for further processing