我有一个校准过的摄像机,我完全知道内在和外在数据.此外,相机的高度也是已知的.现在我想虚拟旋转相机以获得鸟瞰图,这样我就可以构建具有三个旋转角度和平移的Homography矩阵.
我知道可以通过Homography将2个点从一个图像转换为另一个图像
x = K*(Rt*n/d)K ^ -1*x'
我现在想知道一些事情:如果我想要恢复ccs中的图像坐标,我必须将它与K ^ -1相乘,对吧?作为图像坐标,我使用(x',y',1)?
然后我需要构建一个旋转矩阵来旋转ccs ......但我应该使用哪种约定?我怎么知道如何设置我的WCS?
接下来是法线和距离.是否只是将三个点放在地上并计算它们的正常值?并且是相机高度的距离?
此外,我想知道如何改变虚拟鸟瞰摄像机的高度,这样我可以说我想看到3米高的地平面.如何在翻译和单应矩阵中使用单位"米"?
到目前为止,如果有人可以启发并帮助我,那将是很棒的.并且请不要建议用"getperspective"生成鸟类视图,我已经尝试过但这种方式不适合我.
塞纳
我正在尝试学习OpenCV.我有关于单应性和极线几何的问题.
假设我使用cvFindHomography()函数计算单应性,使用两个静态图像匹配的特征点,两个摄像头来自两个不同的视点.
如果我重复使用单应矩阵从相机2拍摄的图像(左)中检测相机1(右)中的对应点是不对的(因为我知道左图像的'2d同质特征点x' = H.x
在哪里x'
,x
是右图像'2d对应的同质特征点和H
单应矩阵)其中camera1和camera2中的2d点不用于计算单应矩阵?
我的意思是,我可以重复利用这两个摄像机的计算单应矩阵来找到任何不用于计算单应矩阵的图像的对应点吗?
当它被固定图像确定时,我使用哪个图像是否重要?或者我每次都要计算它?
我正在使用findHomography
OpenCV 的功能和RANSAC方法,以找到与一组关键点链接的两个图像相关的单应性.主要问题是我无法找到函数输出的掩码矩阵的值.只有我知道的信息是0值是异常值,非零值是内点.但这意味着内部值是多少?有谁知道?
提前致谢!
我打电话给的一段代码findHomography
:
cv::Mat H12;
cv::Mat mask;
H12 = cv::findHomography(FvPointsIm1, FvPointsIm2, mask, CV_RANSAC, 5);
ui->Debug_Label->setText(Mat2QString(mask));
Run Code Online (Sandbox Code Playgroud) 我有一个平面标记,我运行SIFT算法来提取特征.然后我运行一个探测器在场景中找到这个标记并再次提取特征.我匹配点并使用OpenCV从匹配对中提取单应性findHomography()
.
现在,我想用计算的单应性投影在标记中检测到的2D点,以将位置与从场景测量的3D点进行比较,并计算重投影误差.我对像素坐标,厘米,校准矩阵感到困惑,我不知道我应该先做哪些转换.
有人知道这方面的链接还是可以解释方法?
我正在使用我的Kinect进行一些2D 3D图像处理.这是我的问题:我的3D(x,y,z)中的点位于一个平面上.我也知道RGB图像(x,y)上的点的坐标.现在我想估计一个2D-3D单应矩阵来估计(x1,y1,z1)坐标到随机(x1,y1)点.我认为这是可能的,但我不知道从哪里开始.
谢谢!
众所周知,在OpenCV中,我可以在两个图像之间进行仿射或透视转换:
estimateRigidTransform()
FeatureDetector
(SIFT,SURF,BRISK,FREAK,......),然后FlannBasedMatcher
和findHomography()
然后我可以这样做:
warpAffine(img_src, img_dst, M)
warpPerspective(img_src, img_dst, H)
但如果我有3个或更多图像,我已经找到:
然后我可以通过简单地添加两个矩阵来获得转换的matix(img1 - > img3)吗?
M3 = M1 + M2;
H3 = H1 + H2;
或者我应该使用哪些功能?
有人可以告诉我如何应用RANSAC找到最好的4个特征匹配点及其相应的(x,y)坐标,以便我可以在我的单应性代码中使用它们吗?
功能匹配点由SIFT获得,这里是代码:
import numpy as np
import cv2
from matplotlib import pyplot as plt
def drawMatches(img1, kp1, img2, kp2, matches):
rows1 = img1.shape[0]
cols1 = img1.shape[1]
rows2 = img2.shape[0]
cols2 = img2.shape[1]
out = np.zeros((max([rows1,rows2]),cols1+cols2,3), dtype='uint8')
# Place the first image to the left
out[:rows1,:cols1] = np.dstack([img1, img1, img1])
# Place the next image to the right of it
out[:rows2,cols1:] = np.dstack([img2, img2, img2])
# For each pair of points we have between both images
# draw circles, then connect …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个使用手动校准来对齐两个图像的应用程序。我试图将它们几乎完美地对齐,所以我不依赖自动校准,因为它在这种情况下效果不佳。我通过选择像素手动完成此操作。然而结果并不是我所希望的,我也不知道自己错在哪里。我觉得计算出的点应该将图像精确地放置在另一张图像的顶部,但由于某种原因,它没有。我究竟做错了什么?
单应性结果:
[[ 7.43200521e-01 -1.79170744e-02 -1.76782990e+02]
[ 1.00046389e-02 7.84106136e-01 -3.22549155e+01]
[ 5.10695284e-05 -8.48641135e-05 1.00000000e+00]]
Run Code Online (Sandbox Code Playgroud)
手动选取点: RGB:
[[ 277 708]
[1108 654]
[ 632 545]
[ 922 439]
[ 874 403]
[ 398 376]
[ 409 645]
[ 445 593]
[ 693 342]
[ 739 244]
[ 505 234]
[ 408 275]
[ 915 162]
[1094 126]
[ 483 115]
[ 951 366]
[ 517 355]]
Run Code Online (Sandbox Code Playgroud)
热的:
[[ 8 549]
[634 491]
[282 397]
[496 318]
[461 289]
[113 269]
[122 …
Run Code Online (Sandbox Code Playgroud) homography ×10
opencv ×8
c++ ×2
python ×2
ransac ×2
2d ×1
coordinates ×1
kinect ×1
perspective ×1
rotation ×1
translation ×1
warp ×1