29 #include <opencv2/core/version.hpp>
30 #include <opencv2/imgcodecs.hpp>
31 #include <opencv2/imgproc/imgproc.hpp>
46 #define CHECK_STATUS(STMT) \
49 VPIStatus status = (STMT); \
50 if (status != VPI_SUCCESS) \
52 char buffer[VPI_MAX_STATUS_MESSAGE_LENGTH]; \
53 vpiGetLastStatusMessage(buffer, sizeof(buffer)); \
54 std::ostringstream ss; \
55 ss << vpiStatusGetName(status) << ": " << buffer; \
56 throw std::runtime_error(ss.str()); \
60 int main(
int argc,
char *argv[])
84 throw std::runtime_error(std::string(
"Usage: ") + argv[0] +
" <input image>");
87 std::string strInputFileName = argv[1];
90 cvImage = cv::imread(strInputFileName);
93 throw std::runtime_error(
"Can't open '" + strInputFileName +
"'");
100 const int parentWidth = cvImage.cols, parentHeight = cvImage.rows;
103 const int viewWidth = parentWidth / 2, viewHeight = parentHeight / 2;
105 if ((viewWidth == 0) || (viewHeight == 0))
107 throw std::runtime_error(std::string(
"Input image too small, it must be at least 2x2"));
119 for (
int i = 0; i < 4; ++i)
127 clipBounds.x =
static_cast<int>(i % 2) * viewWidth;
128 clipBounds.y =
static_cast<int>(i / 2) * viewHeight;
129 clipBounds.width = viewWidth;
130 clipBounds.height = viewHeight;
183 imwrite(
"output_views.png", cvOut);
188 catch (std::exception &e)
190 std::cerr << e.what() << std::endl;
197 for (
int i = 0; i < 4; ++i)
199 if (streams[i] != NULL)
206 for (
int i = 0; i < 4; ++i)
用于处理 VPI 的 OpenCV 互操作性的函数。
VPIStatus vpiSubmitBilateralFilter(VPIStream stream, uint64_t backend, VPIImage input, VPIImage output, int32_t kernelSize, float sigmaRange, float sigmaSpace, VPIBorderExtension border)
对图像运行 2D 双边滤波器。
struct VPIEventImpl * VPIEvent
事件的句柄。
VPIStatus vpiEventRecord(VPIEvent event, VPIStream stream)
捕获事件中调用此函数时流命令队列的内容。
VPIStatus vpiEventCreate(uint64_t flags, VPIEvent *event)
创建事件实例。
void vpiEventDestroy(VPIEvent event)
销毁事件实例以及它拥有的所有资源。
VPIStatus vpiSubmitImageFlip(VPIStream stream, uint64_t backend, VPIImage input, VPIImage output, VPIFlipMode flipMode)
水平、垂直或同时翻转 2D 图像。
VPIImageBufferType bufferType
图像缓冲区类型。
void vpiImageDestroy(VPIImage img)
销毁图像实例。
struct VPIImageImpl * VPIImage
图像的句柄。
VPIStatus vpiImageCreateView(VPIImage imgParent, const VPIRectangleI *clipBounds, uint64_t flags, VPIImage *imgView)
创建图像,该图像包装现有图像的轴对齐矩形子区域。
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。
struct VPIStreamImpl * VPIStream
流的句柄。
VPIStatus vpiStreamWaitEvent(VPIStream stream, VPIEvent event)
推送一个命令,该命令会阻止处理提交到流的所有未来命令,直到 ...
VPIStatus vpiStreamSync(VPIStream stream)
阻止调用线程,直到此流队列中的所有已提交命令都完成(队列为空)...
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
创建流实例。
@ VPI_BACKEND_CUDA
CUDA 后端。
@ VPI_BORDER_ZERO
图像外部的所有像素均被视为零。
@ VPI_LOCK_READ
仅锁定内存以进行读取。