29 #include <opencv2/core/version.hpp>
30 #include <opencv2/imgcodecs.hpp>
31 #include <opencv2/imgproc/imgproc.hpp>
32 #include <opencv2/videoio.hpp>
49 #define CHECK_STATUS(STMT) \
52 VPIStatus status = (STMT); \
53 if (status != VPI_SUCCESS) \
55 char buffer[VPI_MAX_STATUS_MESSAGE_LENGTH]; \
56 vpiGetLastStatusMessage(buffer, sizeof(buffer)); \
57 std::ostringstream ss; \
58 ss << vpiStatusGetName(status) << ": " << buffer; \
59 throw std::runtime_error(ss.str()); \
63 int main(
int argc,
char *argv[])
72 VPIImage imgPrevious = NULL, imgCurrent = NULL, imgOutput = NULL;
86 throw std::runtime_error(std::string(
"用法: ") + argv[0] +
" <vic|cuda> <input_video>");
89 std::string strBackend = argv[1];
90 std::string strInputVideo = argv[2];
95 if (strBackend ==
"cuda")
99 else if (strBackend ==
"vic")
105 throw std::runtime_error(
"后端 '" + strBackend +
"' 无法识别,它必须是 cuda 或 vic。");
112 cv::VideoCapture invid;
113 if (!invid.open(strInputVideo))
115 throw std::runtime_error(
"无法打开 '" + strInputVideo +
"'");
119 int w = invid.get(cv::CAP_PROP_FRAME_WIDTH);
120 int h = invid.get(cv::CAP_PROP_FRAME_HEIGHT);
121 int fourcc = cv::VideoWriter::fourcc(
'M',
'P',
'E',
'G');
122 double fps = invid.get(cv::CAP_PROP_FPS);
125 cv::VideoWriter outVideo(
"denoised_" + strBackend +
".mp4", fourcc, fps, cv::Size(w, h));
126 if (!outVideo.isOpened())
128 throw std::runtime_error(
"无法创建输出视频");
151 while (invid.read(cvFrame))
153 printf(
"帧: %d\n", ++curFrame);
156 if (frameBGR == NULL)
180 imgOutput, ¶ms));
192 outVideo << outFrame;
198 std::swap(imgPrevious, imgOutput);
201 catch (std::exception &e)
203 std::cerr << e.what() << std::endl;
用于处理 OpenCV 与 VPI 互操作性的函数。
void vpiImageDestroy(VPIImage img)
销毁图像实例。
struct VPIImageImpl * VPIImage
图像的句柄。
VPIStatus vpiImageLockData(VPIImage img, VPILockMode mode, VPIImageBufferType bufType, VPIImageData *data)
获取图像对象上的锁并返回图像内容。
VPIStatus vpiImageCreate(int32_t width, int32_t height, VPIImageFormat fmt, uint64_t flags, VPIImage *img)
使用指定的标志创建空图像实例。
VPIStatus vpiImageUnlock(VPIImage img)
释放图像对象上的锁。
@ VPI_IMAGE_BUFFER_HOST_PITCH_LINEAR
主机可访问,平面位于 pitch-linear 内存布局中。
VPIStatus vpiImageCreateWrapperOpenCVMat(const cv::Mat &mat, VPIImageFormat fmt, uint64_t flags, VPIImage *img)
使用给定的图像格式将 cv::Mat 封装在 VPIImage 中。
VPIStatus vpiImageDataExportOpenCVMat(const VPIImageData &imgData, cv::Mat *mat)
使用来自锁定的 VPIImage 的 VPIImageData 中的数据填充现有的 cv::Mat。
VPIStatus vpiImageSetWrappedOpenCVMat(VPIImage img, const cv::Mat &mat)
重新定义现有 VPIImage 包装器的被包裹的 cv::Mat。
struct VPIPayloadImpl * VPIPayload
算法负载的句柄。
void vpiPayloadDestroy(VPIPayload payload)
释放负载对象和所有关联的资源。
struct VPIStreamImpl * VPIStream
流的句柄。
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中的所有提交命令完成(队列为空)...
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
创建流实例。
@ VPI_BACKEND_CUDA
CUDA 后端。
VPITNRPreset preset
要使用的场景预设。
VPIStatus vpiSubmitTemporalNoiseReduction(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage prevFrame, VPIImage curFrame, VPIImage outFrame, const VPITNRParams *params)
将时域噪声消除操作提交到流。
VPIStatus vpiInitTemporalNoiseReductionParams(VPITNRParams *params)
使用默认值初始化 vpiSubmitTemporalNoiseReduction。
VPIStatus vpiCreateTemporalNoiseReduction(uint64_t backends, int32_t width, int32_t height, VPIImageFormat imgFormat, VPITNRVersion version, VPIPayload *payload)
为时域噪声消除算法创建负载。
@ VPI_TNR_PRESET_INDOOR_MEDIUM_LIGHT
中等光线室内场景。
@ VPI_TNR_DEFAULT
选择当前设备和给定后端中可用的最佳质量版本。
定义 vpiSubmitTemporalNoiseReduction 参数的结构。
@ VPI_LOCK_READ
仅锁定内存以进行读取。