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
图像外部的所有像素都被视为零。