2014-01-16 27 views
4

在python中创建了一个rtsp客户端,它接收h264流并将单个h264原始帧作为二进制字符串返回。我正在尝试处理每个h264帧。opencv单个h264原始帧作为二进制字符串

我不成功地尝试了几种方法将此帧转换为numpy数组进行处理。

到目前为止,我知道cv2.VideoCapture只接受一个文件名作为它的参数,而不是一个帧既不是一个StringIO对象(像指向缓冲区的文件那样的文件),但我需要传递给它我的字符串。

我也曾尝试类似:

nparr = np.fromstring(frame_bin_str, np.uint8) 
img_np = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR) 

试图diferent标志。但也失败了。

经过许多其他失败的尝试,我跑出了想法。

总结我需要做的事情:我在一个变量中有一个h264原始帧,我需要创建一个openvc有效的numpy数组,或者以某种方式结束包含该单帧的VideoCapture对象,这样我就可以处理框架。

任何指针将不胜感激。

希望这一切都有道理。

预先感谢您

+0

afaik openCV不支持h264原始格式。在我们当前的项目中,有人编写了一些代码,逐帧读取这些文件(跳转到给定帧号的字节位置),并根据h264格式规则手动解释字节信息以获取openCV可用数据。 – Micka

+0

谢谢你的回应Micka。如果我将这些帧转储到带有“\ x0 \ x00 \ x00 \ x001”分隔符的文件中。并从中创建一个VideoCapture对象。所有的作品都很完美。我可以逐帧阅读和检索并正确处理它们。所以我认为支持在那里。我不知道如何加载一个单一的框架,而不是一个文件。 – user3202342

回答

0

由于Micka建议,对于在OpenCV的H264 RAW格式不支持,我们应该把它转换自己。

我认为你应该将nparr重塑成传入图像的形状。没有必要做imdecode。使用imshow显示结果并进行验证。

这是我用来以类似的方式转换16位RAW图像(灰度)的代码。我在显示之前重新标准化了图像。

framenp = np.fromstring(framestr, dtype=np.uint16).reshape((1024,1280)) 
#renormalizing to float 
framenp = (framenp*1./framenp.max()) 
framenp.dtype = np.float 
cv2.imshow('frame', cv2.resize(framenp, (640,480))) 
相关问题