通过构造Sift类实例可实现对输入的图像进行特征提取。给定输入图片张量以及用于限制特征提取区域的掩模矩形框,调用特征提取接口执行相应的模型推理,输出提取的特征点列表及描述子列表。
使用Sift类进行特征点提取时,需要提前生成构建尺度空间的om模型,可按照如下步骤进行。
. ${CANN_INSTALL_PATH}/ascend-toolkit/set_env.sh
. ${MX_SDK_HOME}/set_env.sh
cd ${MX_SDK_HOME}
mkdir data cd data
python3 ../bin/generate_sift_weights.py
cd ${MX_SDK_HOME}/bin
./sift soc_version
// 初始化 MxBase::MxInit(); { // 构造图像处理类 ImageProcessor imageProcessor(deviceId) // 图像解码操作生成Image // 解码后的图像类 Image image; //根据图像路径进行解码 APP_ERROR ret = imageProcessor.Decode(imagePath, image); if (ret != APP_ERR_OK) { return 0; } // 将图像转换为张量,且张量排布格式为HWC Tensor tensor = image.ConvertToTensor(true, false); // 通过张量方法对图像进行色域转换 // 定义色域转换类型 auto mode = MxBase::CvtColorMode::COLOR_YUVSP4202GRAY; // 定义输出张量 Tensor imgTensor; // 执行色域转换 CvtColor(tensor, imgTensor, mode, true); // 定义掩码矩形框 Rect mask = MxBase::Rect(x0, x1, y0, y1); // 定义特征点列表 vector<cv::KeyPoint> keyPoints; // 定义描述子列表 cv::Mat descriptors; try { // 构造特征提取类 Sift sift(nFeatures, nOctaveLayers, contrastThreshold, edgeThreshold, sigma, descriptorType); // 初始化模型特征提取资源 sift.Init(deviceId) // 执行特征提取 sift.DetectAndCompute(imgTensor, mask, keyPoints, descriptors, false) } catch (runtime_error error) { return 0; } } // 去初始化 MxBase::MxDeInit();