29 #include <opencv2/core/version.hpp> 
 30 #if CV_MAJOR_VERSION >= 3 
 31 # include <opencv2/imgcodecs.hpp> 
 33 # include <opencv2/contrib/contrib.hpp>  
 34 # include <opencv2/highgui/highgui.hpp> 
 37 #include <opencv2/imgproc/imgproc.hpp> 
 52 #define CHECK_STATUS(STMT) \ 
 55  VPIStatus status = (STMT); \ 
 56  if (status != VPI_SUCCESS) \ 
 58  char buffer[VPI_MAX_STATUS_MESSAGE_LENGTH]; \ 
 59  vpiGetLastStatusMessage(buffer, sizeof(buffer)); \ 
 60  std::ostringstream ss; \ 
 61  ss << vpiStatusGetName(status) << ": " << buffer; \
 
 62  throw std::runtime_error(ss.str()); \
 
 66 static cv::Mat DrawKeypoints(cv::Mat img, 
VPIKeypointF32 *kpts, uint32_t *scores, 
int numKeypoints)
 
 69  img.convertTo(out, CV_8UC1);
 
 70  cvtColor(out, out, cv::COLOR_GRAY2BGR);
 
 72  if (numKeypoints == 0)
 
 78  cv::Mat cmap(1, 256, CV_8UC3);
 
 80  cv::Mat gray(1, 256, CV_8UC1);
 
 81  for (
int i = 0; i < 256; ++i)
 
 83  gray.at<
unsigned char>(0, i) = i;
 
 85  applyColorMap(gray, cmap, cv::COLORMAP_HOT);
 
 88  float maxScore = *std::max_element(scores, scores + numKeypoints);
 
 90  for (
int i = 0; i < numKeypoints; ++i)
 
 92  cv::Vec3b color = cmap.at<cv::Vec3b>(scores[i] / maxScore * 255);
 
 93  circle(out, cv::Point(kpts[i].x, kpts[i].y), 3, cv::Scalar(color[0], color[1], color[2]), -1);
 
 99 int main(
int argc, 
char *argv[])
 
 122  throw std::runtime_error(std::string(
"Usage: ") + argv[0] + 
" <cpu|pva|cuda> <input image>");
 
 125  std::string strBackend = argv[1];
 
 126  std::string strInputFileName = argv[2];
 
 131  if (strBackend == 
"cpu")
 
 135  else if (strBackend == 
"cuda")
 
 139  else if (strBackend == 
"pva")
 
 145  throw std::runtime_error(
"后端 '" + strBackend +
 
 146  "' 无法识别,它必须是 cpu、cuda 或 pva 之一。");
 
 152  cvImage = cv::imread(strInputFileName);
 
 155  throw std::runtime_error(
"无法打开 '" + strInputFileName + 
"'");
 
 210  uint32_t *outScores = (uint32_t *)outScoresData.
buffer.
aos.
data;
 
 217  cv::Mat outImage = DrawKeypoints(img, outKeypoints, outScores, *outKeypointsData.
buffer.
aos.
sizePointer);
 
 219  imwrite(
"harris_corners_" + strBackend + 
".png", outImage);
 
 226  catch (std::exception &e)
 
 228  std::cerr << e.what() << std::endl;
 
用于处理 OpenCV 与 VPI 互操作性的函数。
VPIArrayBuffer buffer
存储数组内容。
int32_t * sizePointer
指向数组中元素的数量。
VPIArrayBufferAOS aos
以结构数组布局存储的数组。
VPIStatus vpiArrayUnlock(VPIArray array)
释放数组对象的锁定。
VPIStatus vpiArrayLockData(VPIArray array, VPILockMode mode, VPIArrayBufferType bufType, VPIArrayData *data)
获取数组对象的锁定并返回数组内容。
void vpiArrayDestroy(VPIArray array)
销毁数组实例。
VPIStatus vpiArrayCreate(int32_t capacity, VPIArrayType type, uint64_t flags, VPIArray *array)
创建空数组实例。
struct VPIArrayImpl * VPIArray
数组的句柄。
@ VPI_ARRAY_TYPE_U32
无符号 32 位。
@ VPI_ARRAY_TYPE_KEYPOINT_F32
VPIKeypointF32 元素。
@ VPI_ARRAY_BUFFER_HOST_AOS
主机可访问的结构体数组。
float sensitivity
指定 Harris-Stephens 方程的灵敏度阈值。
VPIStatus vpiSubmitHarrisCornerDetector(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage input, VPIArray outFeatures, VPIArray outScores, const VPIHarrisCornerDetectorParams *params)
向流提交 Harris 角点检测器操作。
VPIStatus vpiInitHarrisCornerDetectorParams(VPIHarrisCornerDetectorParams *params)
使用默认值初始化 VPIHarrisCornerDetectorParams。
VPIStatus vpiCreateHarrisCornerDetector(uint64_t backends, int32_t inputWidth, int32_t inputHeight, VPIPayload *payload)
创建 Harris 角点检测器负载。
定义 vpiSubmitHarrisCornerDetector 参数的结构体。
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。
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 后端。
@ VPI_LOCK_READ
锁定内存仅用于读取。
存储 float32 关键点坐标。坐标相对于图像的左上角。