删除OpenCV(关键点和描述符)中的匹配项
Delete matches in OpenCV (Keypoints and descriptors)
我想对照两个火车图像检查一个场景图像。为此,我检测两个训练图像的特征并计算描述符。在检测、计算和匹配场景图像之前,我将删除train1和train2的所有匹配。因为这些匹配将不利于场景图像与train1和train2的匹配。
所以,我将train1和train2进行匹配,并得到与trainIdx和queryIdx匹配的向量。但是,我如何删除train1和train2的关键点向量和描述符矩阵中的这些匹配?
谨致问候,dwi
我会这样做:
std::vector<cv::KeyPoint> keypoints[2];
cv::Mat descriptor[2];
std::vector< cv::DMatch > matches;
/*
Write code to generate the keypoints, descriptors and matches here...
keypoint[0] -> Train Image 1 keypoints
keypoint[1] -> Train Image 2 keypoints
descriptor[0] -> Train Image 1 descriptors
descriptor[1] -> Train Image 2 descriptors
matches -> matched between train image 1 and 2
*/
// Logic to keep unmatched keypoints and corresponding descriptors
for (int idx = 0; idx < 2; idx++) {
std::vector<bool> isMatched(keypoints[idx].size(), false);
// Mark all matched keypoint as true
for (int i = 0; i < matches.size(); i++) {
if (idx == 0) {
isMatched[matches[i].queryIdx] = true;
}
else {
isMatched[matches[i].trainIdx] = true;
}
}
std::vector<cv::KeyPoint>::const_iterator itr = keypoints[idx].begin();
// New descriptor length will be old descriptor length minus matched keypoints size
int descriptor_length = keypoints[idx].size() - matches.size();
// Create temporary descriptor of new descriptor length
cv::Mat tempDescriptor(descriptor_length, descriptor[idx].cols, descriptor[idx].depth());
int count = 0;
for (int i = 0; i < isMatched.size(); i++) {
// Remove matched keypoints
if (isMatched[i] == true) {
itr = keypoints[idx].erase(itr);
}
else {
descriptor[idx].row(i).copyTo(tempDescriptor.row(count));
itr++;
count++;
}
}
descriptor[idx].release();
descriptor[idx] = tempDescriptor.clone();
}
我希望这会有所帮助。
好吧,就像Micka建议的那样,我迭代所有关键点和描述符,并将除匹配项外的所有关键点或描述符添加到一个新的向量/矩阵中。不可能将它们标记为不必要的。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- OpenCV C++.快速计算混淆矩阵
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 哪些库可以通过Opencv调整曝光率
- OPENCV关键点断言
- 删除OpenCV(关键点和描述符)中的匹配项
- OpenCV——程序在检测图像关键点的步骤停止运行
- SIFT的OpenCV编号曾经作为第一个关键点数字匹配
- 如何在 C++ 的 OpenCV 3.0.0、Visual Studio 2013 中检测关键点、计算描述符并匹配这些描
- 如何根据响应对 opencv 关键点进行排序
- 如何在OpenCV中比较两个组关键点
- openCV中SIFT检测到的关键点,其大小为相关区域的半径或直径
- OpenCV SIFT描述符关键点半径
- "&":对绑定成员函数表达式的非法操作。从关键点矢量 OpenCV 获取容量
- OpenCV关键点响应,或大或小