int method = 0;
std::vector<cv::KeyPoint> keypoints_object, keypoints_scene;
cv::Mat descriptors_object, descriptors_scene;
cv::ORB orb;
int minHessian = 500;
//cv::OrbFeatureDetector detector(500);
//ORB orb(25, 1.0f, 2, 10, 0, 2, 0, 10);
cv::OrbFeatureDetector detector(25, 1.0f, 2, 10, 0, 2, 0, 10);
//cv::OrbFeatureDetector detector(500,1.20000004768,8,31,0,2,ORB::HARRIS_SCORE,31);
cv::OrbDescriptorExtractor extractor;
//-- object
if( method == 0 ) { //-- ORB
orb.detect(img_object, keypoints_object);
//cv::drawKeypoints(img_object, keypoints_object, img_object, cv::Scalar(0,255,255));
//cv::imshow("template", img_object);
orb.compute(img_object, keypoints_object, descriptors_object);
} else { //-- SURF test
detector.detect(img_object, keypoints_object);
extractor.compute(img_object, keypoints_object, descriptors_object);
}
// http://stackoverflow.com/a/11798593
//if(descriptors_object.type() != CV_32F)
// descriptors_object.convertTo(descriptors_object, …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我正在接收图像流,我想在其中监视设置的 ROI 内检测到的特征。这是使用 ORB 检测器完成的。在第一幅图像中,我使用检测器查找给定 ROI 的“参考”关键点和描述符。对于后续图像,我找到相同 ROI 的“测试”关键点和描述符。然后,我使用 knn 匹配器来查找引用描述符和测试描述符之间的匹配。最后,我尝试找到“最佳”匹配,将关联的关键点添加到“匹配的关键点”集合中,然后计算“匹配强度”。该匹配强度旨在指示参考图像中找到的关键点与测试图像中的关键点的匹配程度。
我有几个问题:
1 - 这是特征检测器的有效使用吗?我知道简单的模板匹配可能会给我类似的结果,但我希望避免光照轻微变化的问题。
2 - 我是否正确筛选我的比赛以获取“好”比赛,然后我是否获得了该比赛的正确关联的关键点?
3 - 我的代码似乎按原样工作,但是,如果我尝试使用流转移到 OpenCV 调用的异步版本,我会得到一个异常:“函数 cv::cuda::GpuMat::setTo 中的资源句柄无效”发生在对 ORB_Impl::buildScalePyramids 的调用中(从 ORB_Impl::detectAndComputeAsync 调用)。请参阅下面的“NewFrame”函数的异步版本。这让我觉得我没有正确设置所有这些。
这是我的代码:
void Matcher::Matcher()
{
// create ORB detector and descriptor matcher
m_b = cuda::ORB::create(500, 1.2f, 8, 31, 0, 2, 0, 31, 20, true);
m_descriptorMatcher = cv::cuda::DescriptorMatcher::createBFMatcher(cv::NORM_HAMMING);
}
void Matcher::Configure(int imageWidth, int imageHeight, int roiX, int roiY, int roiW, int roiH)
{
// set member variables
m_imageWidth = imageWidth;
m_imageHeight = imageHeight; …Run Code Online (Sandbox Code Playgroud) 我想使用orb探测器在找到的图像周围绘制一个边界框,类似于这里使用筛选探测器的示例:SIFT Refrence
Linked示例使用FlannBasedMatcher.我的代码使用BFMatcher.我在使用的Matcher中没有偏好.
MIN_MATCH_COUNT = 10
img1 = cv2.imread('box.png',0)
img2 = cv2.imread('box_in_scene.png',0)
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1,des2)
Run Code Online (Sandbox Code Playgroud)
我将如何继续使用单应性来绘制box_in_scene图像?
编辑:我尝试了以下,但输出不是预期的.
src_pts = np.float32([ kp1[m.queryIdx].pt for m in matches[:50] ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in matches[:50] ]).reshape(-1,1,2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
matchesMask = mask.ravel().tolist()
h,w = img1.shape
pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
dst = cv2.perspectiveTransform(pts,M)
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试ORB SLAM 2和这样的立体相机。我对左右相机/图像使用 2.8 毫米和可选的 3.6 毫米镜头,分辨率为 640x480 像素。
ORB SLAM 2 允许我使用设置文件 (*.yaml) 定义几个失真/校正参数,例如:
fx, fy, cx, cy
k1, k2, p1, p2
Run Code Online (Sandbox Code Playgroud)
我使用此处描述的棋盘(9x7 内角和 70mm 方形长度)进行了 OpenCV 相机校准。后来我使用了MRPT 的自动校准程序,它给了我相同的结果,但障碍更少。
但是,ORB SLAM 2 允许我定义这些附加参数来预校正图像(如果我理解正确的话):
D: 1x5 Matrix -> Distortion Coefficients aquired from calibration (fx,fy,cx,cy) ?
K: 3x3 Matrix -> Intrinsic Matrix aquired from calibration (k1,k2,p1,p2,k3) ?
R: 3x3 Matrix -> Rectification Transformation ?
P: 3x4 Matrix -> New Projection Matrix ?
Run Code Online (Sandbox Code Playgroud)
我的问题如下(请参阅下面的示例 settings.yaml …
我有一个图像目录,其中包含许多无法识别的重复项。我的目标是识别重复项。由于重复项已被裁剪、调整大小或转换为不同的图像格式,因此无法通过比较其哈希值来检测它们。
我编写了一个可以成功检测重复项的脚本,但有一个主要缺点:该脚本速度很慢。在对包含 60 个项目的文件夹进行测试时,运行需要五个小时(这也可能反映了我的计算机越来越有问题且速度缓慢)。由于我的目录中有大约 66,000 个图像,因此我估计脚本需要 229 天才能完成。
有人可以提出解决方案吗?我的研究表明,您可以通过在循环完成时“释放”存储在变量中的图像来释放内存,但有关如何执行此操作的所有信息似乎都是用 C 编写的,而不是用 Python 编写的。我也想过尝试使用orb而不是 sift,但担心它的准确性。有谁对这两种选择中哪一种更好有建议吗?或者重写脚本以减少内存占用的方法?提前谢谢了。
from __future__ import division
import cv2
import numpy as np
import glob
import pandas as pd
listOfTitles1 = []
listOfTitles2 = []
listOfSimilarities = []
# Sift and Flann
sift = cv2.xfeatures2d.SIFT_create()
index_params = dict(algorithm=0, trees=5)
search_params = dict()
flann = cv2.FlannBasedMatcher(index_params, search_params)
# Load all the images1
countInner = 0
countOuter = 1
folder = r"/Downloads/images/**/*"
for a in glob.iglob(folder,recursive=True):
for …Run Code Online (Sandbox Code Playgroud) 在阅读了这篇论文以及许多answers.opencv问题之后,我想知道是否有任何ORB Bag Of Words的代码示例?我只能找到SURF或SIFT举例.
比较两个图像时feature extraction,如何比较keypoint距离,以忽略明显不正确的距离?
我发现在比较相似的图像时,大多数情况下它可以相当准确,但有时它可以抛出完全独立的匹配.
所以我想keypoints从两个图像中查看两组图像并确定匹配keypoints是否相对位于两者的相同位置.如在其中已知keypoints在图像1上1,2和3相距很远,因此在图像2上匹配的对应关键点应该具有彼此远离彼此相当类似的距离.
我过去曾经使用RANSAC和minimum distance检查但只是为了一些效果,它们似乎并不像我追求的那么彻底.
(使用ORB和BruteForce)
编辑
将"x,y和z"更改为"1,2和3"
编辑2 - 我将尝试使用快速绘制的示例进一步解释:
说我有这个作为我的形象:

我给它这个图像来比较:

它是原始的裁剪和压扁版本,但显然相似.
现在,假设您已经完成了它feature detection并且它返回了这keypoints两个图像的结果:


的keypoints两个图像是在大致相同的区域,并且成比例地相同的距离相互远离.把keypoint我圈起来,我们称之为"Image 1 Keypoint 1".

我们可以看到keypoints周围有5个.它们之间的距离和我想要获得的"Image 1 Keypoint 1",以便将它们与"Image 2 Keypoint 1"及其5个环绕keypoints在同一区域(见下文)进行比较,以便不仅仅是将a keypoint与另一个进行比较keypoint,但要比较基于位置的"已知形状"keypoints.

-
那有意义吗?
我正在尝试在我的mac中使用opencv和python来匹配对象.
但是我收到了这个错误.
OpenCV: Cannot Use FaceTime HD Kamera (Yerle?ik)
OpenCV: camera failed to properly initialize!
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)
这也是我的代码.
import numpy as np
import cv2
import time
ESC=27
camera = cv2.VideoCapture(0)
orb = cv2.ORB_create()
while True:
ret, imgCamColor = camera.read()
imgCamGray = cv2.cvtColor(imgCamColor, cv2.COLOR_BGR2GRAY)
kpCam = orb.detect(imgCamGray,None)
kpCam, desCam = orb.compute(imgCamGray, kpCam)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(desCam,desTrain)
good = []
cv2.imshow('Camara', result)
key = cv2.waitKey(20)
if key == ESC:
break
cv2.destroyAllWindows()
camera.release()
Run Code Online (Sandbox Code Playgroud)
我也尝试了一些东西.但它不起作用.
我正在尝试编写一个匹配ORB功能的函数.我没有使用默认匹配器(bfmatcher,flann matcher),因为我只想在图像中使用其他图像中的特征匹配特征.
我看到ORS描述符是一个二进制数组.
我的问题是如何匹配2个特征,即如何找到2个描述符之间的汉明距离?
ORB描述符:
descriptor1 =[34, 200, 96, 158, 75, 208, 158, 230, 151, 85, 192, 131, 40, 142, 54, 64, 75, 251, 147, 195, 78, 11, 62, 245, 49, 32, 154, 59, 21, 28, 52, 222]
descriptor2 =[128, 129, 2, 129, 196, 2, 168, 101, 60, 35, 83, 18, 12, 10, 104, 73, 122, 13, 2, 176, 114, 188, 1, 198, 12, 0, 154, 68, 5, 8, 177, 128]
Run Code Online (Sandbox Code Playgroud)
谢谢.