OpenCV 中的 VideoReader 已弃用。 OpenCV 是不是有任何更新或任何替代?
Posted
技术标签:
【中文标题】OpenCV 中的 VideoReader 已弃用。 OpenCV 是不是有任何更新或任何替代?【英文标题】:VideoReader in OpenCV is deprecated. Is there any update from OpenCV or any substitution?OpenCV 中的 VideoReader 已弃用。 OpenCV 是否有任何更新或任何替代? 【发布时间】:2019-02-02 12:52:52 【问题描述】:我正在进行视频解码以抓取帧以进行一些后期视频处理。我正在使用 opencv Cuda,所以我真的需要来自 opencv cuda 的视频阅读器。然而,我意识到:
在 NVIDIA Video Codec SDK 8.2.15 中,它说
在未来的 SDK 版本中,将从解码器 API 中移除对 CUvideosource 和相关 API 的支持,包括 cuvidCreateVideoSource、cuvidCreateVideoSourceW、cuvidDestroyVideoSource、cuvidSetVideoSourceState、cuvidGetVideoSourceState、cuvidGetSourceVideoFormat、cuvidGetSourceAudioFormat。请注意,SDK 中新的解码示例应用程序不使用这些 API,而是使用 FFmpeg。
但要在 OpenCV Cuda 中使用“createVideoReader”,我们需要链接“dynlink_nvcuvid.h”,其中包含
tcuvidCreateVideoSource *cuvidCreateVideoSource;
tcuvidCreateVideoSourceW *cuvidCreateVideoSourceW;
tcuvidDestroyVideoSource *cuvidDestroyVideoSource;
tcuvidSetVideoSourceState *cuvidSetVideoSourceState;
tcuvidGetVideoSourceState *cuvidGetVideoSourceState;
tcuvidGetSourceVideoFormat *cuvidGetSourceVideoFormat;
tcuvidGetSourceAudioFormat *cuvidGetSourceAudioFormat;
opencv 对视频解码有任何更新吗?我们如何在 OpenCV 中使用 FFmpeg 来替换“dynlink_nvcuvid.h”?我正在尝试使用 NVIDIA 视频解码,但我坚持将视频帧转换为 GpuMat。
我正在使用 Ubuntu 18 库达 9.2 OpenCV 3.4.2
对于 Cuda 部分,为了解码,我使用了以下代码:
FFmpegDemuxer demuxer(szInFilePath);
NvDecoder dec(cuContext, demuxer.GetWidth(), demuxer.GetHeight(), true, FFmpeg2NvCodecId(demuxer.GetVideoCodec()));
FramePresenterGL presenter(cuContext, demuxer.GetWidth(), demuxer.GetHeight());
uint8_t *dpFrame = 0;
int nPitch = 0;
int nVideoBytes = 0, nFrameReturned = 0, nFrame = 0;
uint8_t *pVideo = NULL;
uint8_t **ppFrame;
do
demuxer.Demux(&pVideo, &nVideoBytes);
dec.Decode(pVideo, nVideoBytes, &ppFrame, &nFrameReturned);
if (!nFrame && nFrameReturned)
LOG(INFO) << dec.GetVideoInfo();
for (int i = 0; i < nFrameReturned; i++)
presenter.GetDeviceFrameBuffer(&dpFrame, &nPitch);
if (dec.GetBitDepth() == 8)
Nv12ToBgra32((uint8_t *)ppFrame[i], dec.GetWidth(), (uint8_t *)dpFrame, nPitch, dec.GetWidth(), dec.GetHeight());
else
P016ToBgra32((uint8_t *)ppFrame[i], 2 * dec.GetWidth(), (uint8_t *)dpFrame, nPitch, dec.GetWidth(), dec.GetHeight());
cv::Size sz(dec.GetWidth(),dec.GetHeight());
cv::Mat mat1(sz,CV_8UC3, ppFrame);
cv::imshow ("test", mat1);
cv::waitKey(0);
nFrame += nFrameReturned;
while (nVideoBytes);
任何人都有将 opencv cuda 与实际视频编解码器 api 结合使用的经验吗?如何将视频帧放入 GpuMat?
更新:
我尝试转换 uint8_t 但图像显示错误,如下图所示:
我使用的代码在上面进行了更新。我应该改变什么才能正确显示图像?我试过https://***.com/a/51520728/7939409,但对于下面的代码,下载的Left 是空的。
cv::Mat downloadedLeft;
cv::cuda::GpuMat gpuLeft;
cudaMalloc((void **)&ppFrame, gpuLeft.rows*gpuLeft.step);
cudaMemcpyAsync(ppFrame, gpuLeft.ptr<uint8_t>(), gpuLeft.rows*gpuLeft.step, cudaMemcpyDeviceToDevice);
gpuLeft.download(downloadedLeft);
cv::imshow ("test", downloadedLeft);
cv::waitKey(1);
【问题讨论】:
也许你可以像这个人一样编写自己的库github.com/vdkkia/Using-Opencv-with-ffmpeg-in-python3- @talonmies 你能停止从我的帖子中删除 cuda 标签吗?我用过 cuda 的 ffmpegdemuxer、NvDecoder 和所有与 cuda 相关的东西。 我删除了它一次,它最初是写的。该帖子与CUDA编程无关。 OpenCV 不是 CUDA。 NVIDIA 视频解码 SDK 不是 CUDA。 FFMPEG 不是 CUDA CUresult 是一个状态码。您不能将其转换为矩阵。甚至建议都没有意义 那么帧存储在uint8_t中?我只是一个 cuda 初学者。 【参考方案1】:我找到了一种简单的 c 方法,无需任何第三方即可读取图像。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int read_image(FILE *rfile, void *buf, int width, int height, int stride, int elem_size)
char *byte_ptr = buf;
int i;
int ret = 1;
if (width <= 0 || height <= 0 || elem_size <= 0)
goto fail_or_end;
for (i = 0; i < height; ++i)
if (fread(byte_ptr, elem_size, width, rfile) != (size_t)width)
goto fail_or_end;
byte_ptr += stride;
ret = 0;
fail_or_end:
return ret;
归功于 netflix vmaf 开源 (file_io.c)。谢谢网飞。 阅读图像后,我设法继续使用 cuda 处理它。
【讨论】:
以上是关于OpenCV 中的 VideoReader 已弃用。 OpenCV 是不是有任何更新或任何替代?的主要内容,如果未能解决你的问题,请参考以下文章
“'deinitialize()' 已弃用:deinitialize(count:) 的默认参数已被删除”Xcode 中的警告
OnActivityResult 方法已弃用,如何使用菜单的 onOptionItemselected 中的 registerForActivityResult
我尝试在教程中的 setFlags 中使用此标志,但已弃用,我该怎么办