OpenCV 中的 VideoReader 已弃用。 OpenCV 是不是有任何更新或任何替代?

     2023-04-15     126

关键词:

【中文标题】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 处理它。

【讨论】:

WifiManager 中的 startScan() 在 Android P 中已弃用

】WifiManager中的startScan()在AndroidP中已弃用【英文标题】:startScan()inWifiManagerdeprecatedinAndroidP【发布时间】:2018-08-1702:42:54【问题描述】:如何从wifi获取扫描结果,例如每3秒,没有mWifimanager.startScan();谷歌说:startScan()Thismethodwasdepr... 查看详情

OnActivityResult 方法已弃用,如何使用菜单的 onOptionItemselected 中的 registerForActivityResult

】OnActivityResult方法已弃用,如何使用菜单的onOptionItemselected中的registerForActivityResult【英文标题】:OnActivityResultmethodisdeprecated,howdoIuseregisterForActivityResultfromaMenu\'sonOptionItemselected【发布时间】:2021-08-1207:38:08【问题描述】:我正在 查看详情

“'deinitialize()' 已弃用:deinitialize(count:) 的默认参数已被删除”Xcode 中的警告

】“\\\'deinitialize()\\\'已弃用:deinitialize(count:)的默认参数已被删除”Xcode中的警告【英文标题】:"\'deinitialize()\'isdeprecated:thedefaultargumenttodeinitialize(count:)hasbeenremoved"warninginXcode“\'deinitialize()\'已弃用:deinitialize 查看详情

我尝试在教程中的 setFlags 中使用此标志,但已弃用,我该怎么办

】我尝试在教程中的setFlags中使用此标志,但已弃用,我该怎么办【英文标题】:ItriedusingthisFlaginsetFlagsfromtutorialbutitsdeprecated,whatdoido【发布时间】:2016-01-1517:05:22【问题描述】:FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET已弃用;那我应该用什... 查看详情

showSoftInputFromInputMethod 已弃用 Android P API 28

...布时间】:2019-07-3005:13:30【问题描述】:InputMethodManager类中的showSoftInputFromInputMethod方法在AndroidP中已弃用。根据documentation,我们 查看详情

现在 Handler() 已弃用,我该使用啥?

...布时间】:2020-07-1608:04:05【问题描述】:如何修复此代码中的弃用警告?或者,还有其他选择吗?Handler().postDelayed(context?.let//code,3000)【问题讨论】:【参考方案1】:我有3个解决方案:明确指 查看详情

如何将 Qt 中的某些内容标记为过时(已弃用)?

】如何将Qt中的某些内容标记为过时(已弃用)?【英文标题】:HowtomarksomethinginQtasobsolete(deprecated)?【发布时间】:2010-11-1420:56:16【问题描述】:在带有Qt4.7的C++中是否存在Q_OBSOLETE或Q_DEPRECATED?或者有没有类似的C++宏或关键字?... 查看详情

Typescript 应用程序中的“mpromise(猫鼬的默认承诺库)已弃用”

】Typescript应用程序中的“mpromise(猫鼬的默认承诺库)已弃用”【英文标题】:"mpromise(mongoose\'sdefaultpromiselibrary)isdeprecated"inTypescriptApplication【发布时间】:2017-02-2814:56:49【问题描述】:如何从Typescript应用程序中解决“不... 查看详情

地点选择器已弃用

...内。一旦弃用期结束,PlacePicker将不再可用(包括兼容库中的版本)。"他们 查看详情

Python 中的 PayPal 自适应付款转换货币请求(已弃用的 API)

】Python中的PayPal自适应付款转换货币请求(已弃用的API)【英文标题】:PayPalAdaptivePaymentsConvertCurrencyRequest(deprecatedAPI)inPython【发布时间】:2020-05-2019:16:31【问题描述】:我找不到任何关于如何在python中使用paypalAPI进行货币兑换... 查看详情

“crbug/1173575,非 JS 模块文件已弃用”颤振中的错误

】“crbug/1173575,非JS模块文件已弃用”颤振中的错误【英文标题】:"crbug/1173575,non-JSmodulefilesdeprecated"Errorinflutter【发布时间】:2021-08-0605:35:34【问题描述】:我用我的应用程序所需的所有数据创建了一个json文件,它工作... 查看详情

Alamofire 已弃用的代码

...建中遇到了不推荐使用的代码通知。我将其追溯到Alamofire中的以下语句。我没有看到任何关于替代品的提及。@available(*,deprecated=3.4.0)publicstaticfuncerrorWithCode( 查看详情

Firebase 发布请求 Swift/SwiftUI 已弃用

...用的警告,如果可能,我想修复它们。这是我的swift文件中的代码:funcsendMessageTouser(totoken: 查看详情

System.Json 已弃用。啥是替代方案? [关闭]

...许多示例使用System.Json,但它现在已被弃用。它目前在.NET中的替代品是什么?【问题讨论】 查看详情

asyncio 中所有这些已弃用的“循环”参数是啥?

...么?【发布时间】:2020-02-2003:11:52【问题描述】:asyncio中的许多函数已弃用loop参数,计划在Python3.10中删除。示例包括as_completed()、sleep()和w 查看详情

Swift 4:'substring(to:)' 已弃用 [重复]

...码转换为Swift4时遇到问题。我已经成功地翻译了应用程序中的所有其他内容,但是在一行代码中遇到了问题: 查看详情

rxjs Subject.create 已弃用-我应该改用啥?

...布时间】:2019-08-2807:55:45【问题描述】:我的Angular应用中的服务中有此代码:constsubby=Subject.create(observer,observable)但我的 查看详情

Observable 在 rxdart 0.23.1 中已弃用

...在我使用Observable类的地方出现错误。我已经阅读了文档中的重大更改,它指定使用我已集成到我的pubspec.yaml文件中的rxdart_codemod包并运行以下命令pubgloba 查看详情