我正在使用Visual Studio 2010上的OpenCV 2.3.1进行图像拼接项目.
我目前有2个问题.
(我的声誉不超过10,所以我只能在这篇文章中发布2个超链接.我会在评论区发布另外2个)
我按照以下链接中提到的步骤 在opencv中拼接2个图像
以下图片是我目前的结果:
使用相机在相同位置但在不同方向拍摄两张图像(我使用三脚架).
然后我尝试了另一个测试.这次我仍然使用相同的相机拍摄2张图像.但是,我将相机从原来的位置移开了一点,然后拍了第二张照片.结果如下所示:
问题1:**这是否意味着**如果2个摄像机处于不同的位置,标准的全景拼接技术(基于单应性或相机旋转模型)将不起作用?
我试图缝在不同位置拍摄的图像,因为在未来,我想实现对2台相机在不同位置的拼接算法,以拓宽视野,排序是这样的:(我会发布的图片在评论, plz检查加宽FOV)
但现在看起来我的方向错了:(.
我刚刚发现在算法期间,特征查找和匹配占用了大部分时间.
问题2:我可以只计算2幅图像的某个部分(重叠区域)中的特征并仍使用Homography执行变换吗?即,不计算整个图像.
我想是这样的,因为我认为如果我指定2个图像之间的重叠区域的数量,则不必计算整个图像中的特征.如果我可以计算和匹配重叠区域中的特征,它应该大大提高速度.
下面显示的第一个代码是原始代码,用于计算整个图像的特征.
int minHessian = 3000;
SurfFeatureDetector detector( minHessian );
vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect( frm1, keypoints_1 );
detector.detect( frm2, keypoints_2 );
//-- Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor; ///
Mat descriptors_1, descriptors_2;
extractor.compute( frm1, keypoints_1, descriptors_1 );
extractor.compute( frm2, keypoints_2, descriptors_2 );
Run Code Online (Sandbox Code Playgroud)
我做了以下事情,试图减少运行整个算法所需的时间:
//detector.detect( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1 );
//detector.detect( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2 );
//-- Calculate descriptors …
Run Code Online (Sandbox Code Playgroud) 我目前正在开展我的项目,该项目涉及车辆检测和跟踪以及估计和优化车辆周围的长方体。为此,我已经完成了车辆的检测和跟踪,我需要找到车辆边界框边缘图像点的3D世界坐标,然后估计长方体和项目边缘的世界坐标它返回图像以显示它。
所以,我是计算机视觉和 OpenCV 的新手,但据我所知,我只需要图像上的 4 个点,需要知道这 4 个点的世界坐标,并在 OpenCV 中使用 solvePNP 来获得旋转和平移向量(我已经有相机矩阵和失真系数)。然后,我需要使用 Rodrigues 将旋转向量转换为旋转矩阵,然后将其与平移向量连接以获得我的外在矩阵,然后将外在矩阵与相机矩阵相乘以获得我的投影矩阵。由于我的 z 坐标为零,因此我需要从投影矩阵中删除第三列,该矩阵给出了用于将 2D 图像点转换为 3D 世界点的单应矩阵。现在,我找到了单应矩阵的逆矩阵,它给出了 3D 世界点到 2D 图像点之间的单应性。
我的代码如下所示:
#include "opencv2/opencv.hpp"
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <math.h>
#include <conio.h>
using namespace cv;
using namespace std;
Mat cameraMatrix, distCoeffs, rotationVector, rotationMatrix,
translationVector,extrinsicMatrix, projectionMatrix, homographyMatrix,
inverseHomographyMatrix;
Point point;
vector<Point2d> image_points;
vector<Point3d> world_points;
int main()
{
FileStorage fs1("intrinsics.yml", FileStorage::READ);
fs1["camera_matrix"] >> cameraMatrix; …
Run Code Online (Sandbox Code Playgroud) 假设我将单应变换H应用于某个原始图像后得到的图像.原始图像未显示.将单应性H应用于原始图像的结果是此图像:
我想将这个图像围绕一个合适的轴旋转30度(可能是相机所在的位置,如果有的话)来获得这个图像:
如果我不知道相机参数,如何使用python应用此旋转变换?我只能指定我想要旋转图像的度数和我想要旋转的近似轴.另外,如何使用H和旋转变换推导原始图像(单应性之前)和最终旋转图像之间的单应性H'?
我有一个来自相机的2个连续图像,我想估计相机姿势的变化:
我计算光流量:
Const MAXFEATURES As Integer = 100
imgA = New Image(Of [Structure].Bgr, Byte)("pic1.bmp")
imgB = New Image(Of [Structure].Bgr, Byte)("pic2.bmp")
grayA = imgA.Convert(Of Gray, Byte)()
grayB = imgB.Convert(Of Gray, Byte)()
imagesize = cvGetSize(grayA)
pyrBufferA = New Emgu.CV.Image(Of Emgu.CV.Structure.Gray, Byte) _
(imagesize.Width + 8, imagesize.Height / 3)
pyrBufferB = New Emgu.CV.Image(Of Emgu.CV.Structure.Gray, Byte) _
(imagesize.Width + 8, imagesize.Height / 3)
features = MAXFEATURES
featuresA = grayA.GoodFeaturesToTrack(features, 0.01, 25, 3)
grayA.FindCornerSubPix(featuresA, New System.Drawing.Size(10, 10),
New System.Drawing.Size(-1, -1),
New Emgu.CV.Structure.MCvTermCriteria(20, 0.03))
features = …
Run Code Online (Sandbox Code Playgroud) 好的,所以我想找到足球比赛的单应性.我现在拥有的是
现在的问题是,由于玩家和来自骄傲的一些噪音,我无法找到适当的单词匹配.同时移除它们也是一个问题,因为这也会隐藏我需要计算单应性的足球场线.
对此有任何建议非常感谢.以下是我正在使用的一些示例代码和图像.
样本图片
http://i65.tinypic.com/21cs9rl.png
我得到的输出
http://i66.tinypic.com/zj6ljo.png
输出右侧的图像是来自视频的帧,左侧的图像是我在filterGreen函数之后上传的相同样本图像,如从代码中可以看到的.
最后我想要的是图像正确映射到中心圆所以我可以在中心绘制一个立方体,有点类似于"这个例子".在此先感谢帮助我.
我有一个校准过的摄像机,我完全知道内在和外在数据.此外,相机的高度也是已知的.现在我想虚拟旋转相机以获得鸟瞰图,这样我就可以构建具有三个旋转角度和平移的Homography矩阵.
我知道可以通过Homography将2个点从一个图像转换为另一个图像
x = K*(Rt*n/d)K ^ -1*x'
我现在想知道一些事情:如果我想要恢复ccs中的图像坐标,我必须将它与K ^ -1相乘,对吧?作为图像坐标,我使用(x',y',1)?
然后我需要构建一个旋转矩阵来旋转ccs ......但我应该使用哪种约定?我怎么知道如何设置我的WCS?
接下来是法线和距离.是否只是将三个点放在地上并计算它们的正常值?并且是相机高度的距离?
此外,我想知道如何改变虚拟鸟瞰摄像机的高度,这样我可以说我想看到3米高的地平面.如何在翻译和单应矩阵中使用单位"米"?
到目前为止,如果有人可以启发并帮助我,那将是很棒的.并且请不要建议用"getperspective"生成鸟类视图,我已经尝试过但这种方式不适合我.
塞纳
我正在使用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) 我想使用 OpenCV 将瓶子上的弯曲矩形标签转换为标准化形式。
我知道:
我的示例图片:
我已经找到了一些类似的主题,例如果酱或瓶子标签的转变。jam example但这不是在 OpenCV 中完成的。果酱标签的示例图像:
如何从弯曲图像中获得最佳变换后的矩形图像?和/或者我必须在 OpenCV 中使用哪些函数?
我知道可以通过使用至少四个对应点来计算单应矩阵。
我想知道如果我已经知道两个相机之间的旋转和平移(包括相机内在函数),是否以及如何获得单应矩阵?
我发现了类似这样的东西
H= K R K^-1
但这假设是纯旋转。纯翻译的情况会怎样?如果我想使用并非纯粹来自平面上的点的单应性矩阵来扭曲图像,该怎么办?
我现在有点困惑,非常感谢任何解释!先感谢您!
transformation computer-vision homography projective-geometry
下面是一个Python脚本,它计算两个图像之间的单应性,然后将所需的点从一个图像映射到另一个图像
import cv2
import numpy as np
if __name__ == '__main__' :
# Read source image.
im_src = cv2.imread(r'C:/Users/kjbaili/.spyder-py3/webcam_calib/homography/khaledd 35.0 sec.jpg')
# Five corners of the book in source image
pts_src = np.array([[281, 238], [325, 297], [283, 330],[248, 325],[213, 321]])
# Read destination image.
im_dst = cv2.imread(r'C:/Users/kjbaili/.spyder-py3/webcam_calib/homography/20.jpg')
# Five corners of the book in destination image.
pts_dst = np.array([[377, 251],[377, 322],[316, 315],[289, 284],[263,255]])
# Calculate Homography
h, status = cv2.findHomography(pts_src, pts_dst)
# provide a point i wish to map from …
Run Code Online (Sandbox Code Playgroud)