opencv 单个 h264 原始帧作为二进制字符串

use*_*342 6 python opencv numpy h.264 mat

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

我尝试了几种方法来将此帧转换为 numpy 数组进行处理,但均未成功。

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

我也尝试过类似的事情:

nparr = np.fromstring(frame_bin_str, np.uint8)
img_np = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR)
Run Code Online (Sandbox Code Playgroud)

尝试了不同的标志。但也惨败。

在许多其他失败的尝试之后,我用完了想法。

总结一下我需要做的事情:我在一个变量中有一个 h264 原始帧,我需要为其创建一个 openvc 有效的 numpy 数组,或者以某种方式最终得到一个包含该单个帧的 VideoCapture 对象,以便我可以处理该帧。

任何指针将不胜感激。

希望这一切都有意义。

先感谢您

Vas*_*nth 2

正如 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)))
Run Code Online (Sandbox Code Playgroud)