29 #include <opencv2/core/version.hpp>
30 #if CV_MAJOR_VERSION >= 3
31 # include <opencv2/imgcodecs.hpp>
33 # include <opencv2/highgui/highgui.hpp>
35 #include <opencv2/imgproc/imgproc.hpp>
51 #define CHECK_STATUS(STMT) \
54 VPIStatus status = (STMT); \
55 if (status != VPI_SUCCESS) \
57 char buffer[VPI_MAX_STATUS_MESSAGE_LENGTH]; \
58 vpiGetLastStatusMessage(buffer, sizeof(buffer)); \
59 std::ostringstream ss; \
60 ss << vpiStatusGetName(status) << ": " << buffer; \
61 throw std::runtime_error(ss.str()); \
65 int main(
int argc,
char *argv[])
79 int originX, originY, templWidth, templHeight;
81 int outWidth, outHeight;
98 throw std::runtime_error(std::string(
"Usage: ") + argv[0] +
" <cpu|cuda> <input image> <x,y,w,h> ");
101 std::string strBackend = argv[1];
102 std::string strInputFileName = argv[2];
104 if (sscanf(argv[3],
"%d,%d,%d,%d", &originX, &originY, &templWidth, &templHeight) != 4)
106 throw std::runtime_error(
107 "Invalid data format. Specify the bounding box of the input image as template image.");
111 cvImage = cv::imread(strInputFileName);
114 throw std::runtime_error(
"Can't open '" + strInputFileName +
"'");
117 assert(cvImage.type() == CV_8UC3);
120 cvtColor(cvImage, cvImageU8, cv::COLOR_BGR2GRAY);
122 if (originX + templWidth > cvImage.cols || originY + templHeight > cvImage.rows)
124 throw std::runtime_error(
"Bounding box is out of range of input image size");
127 cv::Rect templROI(originX, originY, templWidth, templHeight);
128 cv::Mat croppedRef(cvImageU8, templROI);
129 croppedRef.copyTo(cvTempl);
134 if (strBackend ==
"cpu")
138 else if (strBackend ==
"cuda")
144 throw std::runtime_error(
"Backend '" + strBackend +
"' not recognized, it must be either cpu, cuda");
160 outWidth = cvImage.cols - templWidth + 1;
161 outHeight = cvImage.rows - templHeight + 1;
185 CHECK_STATUS(
vpiSubmitMinMaxLoc(stream, backend, payloadMinMax, output, minCoords, maxCoords));
205 int max_i = max_coords[0].y;
206 int max_j = max_coords[0].x;
217 cv::Rect rect(max_i - 20, max_j - 20, 40, 40);
218 rectangle(cvOut, rect, 255, 2);
219 imwrite(
"template_matching_score_" + strBackend +
".png", cvOut);
221 printf(
"Provided coord of bounding box for the template is [%d, %d] with w=%d and h=%d \n", originY,
222 originX, templWidth, templHeight);
223 printf(
"Template matching location coord is [%d, %d] \n", max_j, max_i);
230 catch (std::exception &e)
232 std::cerr << e.what() << std::endl;
用于处理 OpenCV 与 VPI 的互操作性的函数。
VPIArrayBuffer buffer
存储数组内容。
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_KEYPOINT_F32
VPIKeypointF32 元素。
@ VPI_ARRAY_BUFFER_HOST_AOS
主机可访问的结构体数组。
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 vpiCreateMinMaxLoc(uint64_t backends, int32_t imageWidth, int32_t imageHeight, VPIImageFormat imageFormat, VPIPayload *payload)
为 vpiSubmitMinMaxLoc 创建 payload。
VPIStatus vpiSubmitMinMaxLoc(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage input, VPIArray minCoords, VPIArray maxCoords)
在图像中查找最小值和最大值的位置。
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
算法 payload 的句柄。
void vpiPayloadDestroy(VPIPayload payload)
释放 payload 对象和所有相关的资源。
struct VPIStreamImpl * VPIStream
流的句柄。
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中所有提交的命令完成(队列为空)。..
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
创建流实例。
@ VPI_BACKEND_CUDA
CUDA 后端。
VPIStatus vpiCreateTemplateMatching(uint64_t backends, int32_t imageWidth, int32_t imageHeight, VPIPayload *payload)
为 vpiSubmitTemplateMatching 创建 payload。
VPIStatus vpiTemplateMatchingSetSourceImage(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage srcImage)
设置源图像。
VPIStatus vpiTemplateMatchingSetTemplateImage(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage templImage, VPIImage mask)
设置模板图像。
VPIStatus vpiSubmitTemplateMatching(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage output, VPITemplateMatchingMethod method)
使用提供的模板运行模板匹配算法。
@ VPI_TEMPLATE_MATCHING_NCC
归一化互相关。
存储 float32 关键点坐标。坐标相对于图像的左上角。