29 #include <opencv2/core/version.hpp>
30 #include <opencv2/imgcodecs.hpp>
31 #include <opencv2/imgproc/imgproc.hpp>
32 #include <opencv2/videoio.hpp>
48 #define CHECK_STATUS(STMT) \
51 VPIStatus status = (STMT); \
52 if (status != VPI_SUCCESS) \
54 char buffer[VPI_MAX_STATUS_MESSAGE_LENGTH]; \
55 vpiGetLastStatusMessage(buffer, sizeof(buffer)); \
56 std::ostringstream ss; \
57 ss << vpiStatusGetName(status) << ": " << buffer; \
58 throw std::runtime_error(ss.str()); \
65 for (
int i = 0; i < 3; ++i)
67 for (
int j = 0; j < 3; ++j)
69 r[i][j] = a[i][0] * b[0][j];
70 for (
int k = 1; k < 3; ++k)
72 r[i][j] += a[i][k] * b[k][j];
78 int main(
int argc,
char *argv[])
86 VPIImage imgInput = NULL, imgOutput = NULL;
98 throw std::runtime_error(std::string(
"Usage: ") + argv[0] +
" <cpu|vic|cuda> <input_video>");
101 std::string strBackend = argv[1];
102 std::string strInputVideo = argv[2];
107 if (strBackend ==
"cpu")
111 else if (strBackend ==
"cuda")
115 else if (strBackend ==
"vic")
121 throw std::runtime_error(
"Backend '" + strBackend +
122 "' not recognized, it must be either cpu, cuda or vic.");
129 cv::VideoCapture invid;
130 if (!invid.open(strInputVideo))
132 throw std::runtime_error(
"Can't open '" + strInputVideo +
"'");
136 int w = invid.get(cv::CAP_PROP_FRAME_WIDTH);
137 int h = invid.get(cv::CAP_PROP_FRAME_HEIGHT);
138 int fourcc = cv::VideoWriter::fourcc(
'M',
'P',
'E',
'G');
139 double fps = invid.get(cv::CAP_PROP_FPS);
141 cv::VideoWriter outVideo(
"perspwarp_" + strBackend +
".mp4", fourcc, fps, cv::Size(w, h));
142 if (!outVideo.isOpened())
144 throw std::runtime_error(
"Can't create output video");
157 memset(&xform, 0,
sizeof(xform));
163 while (invid.read(cvFrame))
165 printf(
"Frame: %d\n", curFrame++);
167 if (frameBGR == NULL)
185 float v1 = sin(curFrame / 30.0 * 2 * M_PI / 2) * 0.0005f;
186 float v2 = cos(curFrame / 30.0 * 2 * M_PI / 3) * 0.0005f;
194 MatrixMultiply(tmp, P, t1);
195 MatrixMultiply(xform, t2, tmp);
212 outVideo << outFrame;
217 catch (std::exception &e)
219 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。
VPIStatus vpiSubmitPerspectiveWarp(VPIStream stream, uint64_t backend, VPIImage input, const VPIPerspectiveTransform xform, VPIImage output, const VPIWarpGrid *grid, VPIInterpolationType interp, VPIBorderExtension border, uint64_t flags)
向流提交透视扭曲操作。
float VPIPerspectiveTransform[3][3]
表示 2D 透视变换。
struct VPIStreamImpl * VPIStream
流的句柄。
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中的所有提交命令完成(队列为空)...
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
创建流实例。
@ VPI_BACKEND_CUDA
CUDA 后端。
@ VPI_BORDER_ZERO
图像外部的所有像素都被视为零。