有什么好方法可以将可能具有不同旋转,曝光等但具有相同背景或其他固定参考的图像对齐在一起?
Adobe Photoshop可以通过其“ Photomerge”功能实现此目的。
如何以编程方式执行此操作?是否有开放源代码应用程序?
image-processing alignment template-matching image-stitching
我没有找到拼接图像或视频制作的任何服务器端全景图.我想要一个开源替代品,但发现任何.我只是不想通过自己开发所有这些的麻烦,但付费软件通常是封闭源,而不是非常灵活.
我从iphone的视频软件中看到了一些漂亮的全景,并认为在*nix系统上很容易找到,但没有运气.任何帮助将不胜感激.提前致谢.
我正在尝试减少拼接算法的计算时间.我得到了一些我想按照定义的顺序cv::stitcher.stitch()拼接的图像,但似乎功能试图将每个图像与其他所有图像拼接在一起.
我觉得我可能会在OpenCV Stitcher的参数中找到解决方案.如果没有,也许我必须修改功能或尝试其他方法来减少计算时间.但由于我几乎是初学者,我不知道如何.我知道使用GPU可能是一种可能性,但我现在还没有在Ubuntu上运行CUDA.
如果你能给我一些建议,那就太好了!
OpenCV Stitcher模块的参数:
Stitcher Stitcher::createDefault(bool try_use_gpu) {
Stitcher stitcher;
stitcher.setRegistrationResol(0.6);
stitcher.setSeamEstimationResol(0.1);
stitcher.setCompositingResol(ORIG_RESOL);
stitcher.setPanoConfidenceThresh(1);
stitcher.setWaveCorrection(true);
stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);
stitcher.setFeaturesMatcher(new detail::BestOf2NearestMatcher(try_use_gpu));
stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());
Run Code Online (Sandbox Code Playgroud)
来自stitcher.cpp:
https://code.ros.org/trac/opencv/browser/trunk/opencv/modules/stitching/src/stitcher.cpp?rev=7244
我想知道OpenCV 的拼接(http://docs.opencv.org/modules/stitching/doc/stitching.html)模块是否能够将从平行运动的摄像机拍摄的图像拼接到飞机上被拍照?
我知道通常所有的全景拼接工具都假设摄像机的中心是固定的,而摄像机只能进行平移或俯仰等运动.
我在想是否可以使用这个模块缝合从平行于平面移动的相机拍摄的图像.这个想法是创建一个地面的全景地图.
问候
opencv image-processing panoramas image-stitching opencv-stitching
我想将全帧鱼眼图像转换为等距柱状图像,这样我就可以用它进行全景拼接。我为此目的使用了 Hugin 和 libpano,它们工作得很好。以下图片已由 Hugin 转换。我想知道可以实现此类或类似转换的数学方程。
转换后的图像
我想在 OpenCv 中使用单应矩阵拼接两个全景图像。我找到了 3x3 单应矩阵,但无法拼接两个图像。我必须手动缝合两个图像(没有内置功能)。这是我的代码:
import cv2
import numpy as np
MIN_MATCH_COUNT = 10
img1 = cv2.imread("pano1/cyl_image00.png")
img2 = cv2.imread("pano1/cyl_image01.png")
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
des1 = np.float32(des1)
des2 = np.float32(des2)
matches = flann.knnMatch(des1, des2, k=2)
goodMatches = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
goodMatches.append(m)
src_pts = 0
dst_pts = 0
if …Run Code Online (Sandbox Code Playgroud) 我试图通过使用模板匹配将2个图像拼接在一起找到3组点,我通过这些点来cv2.getAffineTransform()获得一个经线矩阵,我将其传递cv2.warpAffine()到对齐我的图像.
然而,当我加入我的图像时,我的大部分仿射图像都没有显示出来.我已经尝试过使用不同的技术来选择点,改变顺序或参数等等,但我只能得到一张瘦弱的图像来显示.
有人可以告诉我,我的方法是否有效,并建议我可能会出错?任何关于可能导致问题的猜测都将非常感激.提前致谢.
这是我得到的最终结果.下面是原始图像(1,2),并且我使用的代码:
编辑:这是变量的结果 trans
array([[ 1.00768049e+00, -3.76690353e-17, -3.13824885e+00],
[ 4.84461775e-03, 1.30769231e+00, 9.61912797e+02]])
Run Code Online (Sandbox Code Playgroud)
以下是传递给我们的观点cv2.getAffineTransform:unified_pair1
array([[ 671., 1024.],
[ 15., 979.],
[ 15., 962.]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
unified_pair2
array([[ 669., 45.],
[ 18., 13.],
[ 18., 0.]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
import cv2
import numpy as np
def showimage(image, name="No name given"):
cv2.imshow(name, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
return
image_a = cv2.imread('image_a.png')
image_b = cv2.imread('image_b.png')
def get_roi(image):
roi = cv2.selectROI(image) # spacebar to confirm …Run Code Online (Sandbox Code Playgroud) 我需要即时拼接五个视频流。录制视频的摄像机并排安装在机架上,并且永远不会改变彼此的相对位置。因此单应性矩阵是静态的。
我正在遵循此 github 存储库中的方法:
从中心图像开始,首先缝合到左侧,然后将其余图像缝合到右侧。
该存储库中的代码可以工作,但速度慢得令人痛苦。我已经能够显着提高其性能(系数 300),但拼接五幅图像的全景图仍然需要 0.25 秒(在 2015 年 Macbook Pro 上)。
缓慢的部分:将每个结果应用于cv2.warpPerspective(...)到该点缝合的图像。受此SO 答案的启发,我目前正在通过使用 alpha 通道并混合两个图像来完成此操作。正是这种混合使得缝合速度变慢。
(伪代码:
def blend_transparent(background, foreground):
overlay_img = foreground[:, :, :3] # Grab the BRG planes
overlay_mask = foreground[:, :, 3:] # And the alpha plane
# Again calculate the inverse mask
background_mask = 255 - overlay_mask
# Turn the masks into three channel, so we can use them as weights
overlay_mask = cv2.cvtColor(overlay_mask, cv2.COLOR_GRAY2BGR)
background_mask = cv2.cvtColor(background_mask, …Run Code Online (Sandbox Code Playgroud) 将 24 个拼接图像拼接到下一个第 25 个图像后,我得到如下输出。在此之前,缝合效果很好。
有谁知道为什么/何时拼接输出会这样?这样的输出有什么可能性?这可能是什么原因?
拼接代码遵循标准拼接步骤,例如查找关键点、描述符,然后匹配点,计算单应性,然后扭曲图像。但我不明白为什么会有这样的输出。
拼接的核心部分如下:
detector = cv2.SIFT_create(400)
# find the keypoints and descriptors with SIFT
gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)
ret1, mask1 = cv2.threshold(gray1,1,255,cv2.THRESH_BINARY)
kp1, descriptors1 = detector.detectAndCompute(gray1,mask1)
gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
ret2, mask2 = cv2.threshold(gray2,1,255,cv2.THRESH_BINARY)
kp2, descriptors2 = detector.detectAndCompute(gray2,mask2)
keypoints1Im = cv2.drawKeypoints(image1, kp1, outImage = cv2.DRAW_MATCHES_FLAGS_DEFAULT, color=(0,0,255))
keypoints2Im = cv2.drawKeypoints(image2, kp2, outImage = cv2.DRAW_MATCHES_FLAGS_DEFAULT, color=(0,0,255))
# BFMatcher with default params
matcher = cv2.BFMatcher()
matches = matcher.knnMatch(descriptors2,descriptors1, k=2)
# Apply ratio test
good = []
for m, n in …Run Code Online (Sandbox Code Playgroud) python opencv image-processing computer-vision image-stitching
您能否给我一些提示,我在哪里可以找到 Python Stitcher 类的详细文档?
我能够找到示例并实现它们,但我想更多地了解这个类及其功能。
我愿意对6个鱼眼相机进行360\xc2\xb0全景拼接。
\n为了找到相机之间的关系,我需要计算单应性矩阵。后者通常是通过查找图像中的特征并进行匹配来计算的。
\n然而,对于我的相机设置我已经知道:
\n因此,我认为我可以手动计算单应性矩阵,我认为这会产生比执行特征匹配更准确的方法。
\n在文献中,我找到了以下公式来计算将图像 2 与图像 1 相关联的单应性矩阵:
\nH_2_1 = (K_2) * (R_2)^-1 * R_1 * K_1\nRun Code Online (Sandbox Code Playgroud)\n该公式仅考虑相机之间的旋转角度,而不考虑我的情况中存在的平移向量。
\n如何将每个摄像机的平移 t 插入到 H 的计算中?
\n我已经尝试在不考虑平移的情况下计算 H,但由于 d>1 米,图像在全景图中没有准确对齐。
\n编辑:
\n根据下面弗朗西斯科的回答,我得到了以下问题:
\n校准鱼眼镜头后,我得到了一个尺寸为 1024 x 768 的图像的K焦距矩阵。f=620这被认为是大焦距还是小焦距?
我的相机位于一个直径为 1 米的圆上。下面的解释让我很清楚,由于相机之间的这种“大”平移,我对距离它们相对较近的物体产生了显着的重影效果。因此,如果Homography模型不能完全代表相机的位置,是否可以使用其他模型(例如Fundamental/Essential Matrix)进行图像拼接?
\ncomputer-vision homography projective-geometry image-stitching 360-panorama
image-stitching ×13
opencv ×10
panoramas ×4
python ×4
homography ×2
360-panorama ×1
alignment ×1
c++ ×1
fisheye ×1
image ×1
server-side ×1