import cv2
import glob
import argparse
import math
from numpy import genfromtxt
import matplotlib.pyplot as plt
import numpy as np
import os.path
from scipy import ndimage
import os
left = cv2.imread('D:/input image 1.jpg', cv2.IMREAD_UNCHANGED)
right = cv2.imread('D:/input image 2.jpg', cv2.IMREAD_UNCHANGED)
#left = (left/256).astype('uint8')
#right = (right/256).astype('uint8')
cameraMatrix1 = np.array([[1485.8503101355045, 0, 641.0072474534551], [0, 1486.8249802291273, 454.1981417235667], [0, 0, 1]])
cameraMatrix2 = np.array([[1472.34425902698, 0, 656.7358738783742], [0, 1473.184475795988, 441.016803589085], [0, 0, 1]])
distCoeffs1 = np.array([-0.09236217303671054, 0.15801009565677457, 0.0020679941868083445, -0.0023435708660260184, 0.04491629603683055])
distCoeffs2 = np.array([-0.09949068652688753, 0.22953391558591676, 0.0016749995113326907, -0.0015940937703328348, -0.13603886268508916])
rotationMatrix = np.array([[0.9999169807005986, 0.0026862926847088424, -0.012602203704541104],[-0.002633967055223802, 0.9999878496600472, 0.0041668633079119935],[0.012613243997904163, -0.004133323588458492, 0.9999119069757908]])
transVector = np.array([29.96389633009774, 0.5883268401189343, -5.0370190999346365])
essentialMatrix = np.array([[-0.005846632380824811, 5.0345261532342365, 0.6092635826971343], [-5.4145428656773165, 0.11031957194242471, -29.897779179091888], [-0.6672019134164675, 29.96195184048419, 0.1322696748639909]])
fundMatrix = np.array([[4.567507458136527e-08, -3.930495370357416e-05, 0.010750771532659317], [4.227537878312907e-05, -8.607826196991683e-07, 0.3201405456504413], [-0.010999824926761303, -0.3182113833954986, 1]])
flags = cv2.CALIB_ZERO_DISPARITY
image_size = left.shape[::-1]
R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, image_size, rotationMatrix, transVector, flags = flags)
leftmapX, leftmapY = cv2.initUndistortRectifyMap(cameraMatrix1, distCoeffs1, R1, P1, image_size, cv2.CV_32FC1)
rightmapX, rightmapY = cv2.initUndistortRectifyMap(cameraMatrix2, distCoeffs2, R2, P2, image_size, cv2.CV_32FC1)
left_remap = cv2.remap(left, leftmapX, leftmapY, cv2.INTER_LANCZOS4)
right_remap = cv2.remap(right, leftmapX, rightmapY, cv2.INTER_LANCZOS4)
# For some reason, the images get rotated upside down after remapping, and I have to invert them back
left_remap = ndimage.rotate(left_remap,180)
right_remap = ndimage.rotate(right_remap,180)
for line in range(0, int(right_remap.shape[0] / 20)):
left_remap[line * 20, :] = 0
right_remap[line * 20, :] = 0
cv2.namedWindow('output images', cv2.WINDOW_NORMAL)
cv2.imshow('output images', np.hstack([left_remap, right_remap]))
cv2.waitKey(0)
cv2.destroyAllWindows()
Я работаю над выпрямлением 5 разных линз как по горизонтали, так и по вертикали (т.е. мне нужны все точки соприкосновения точно в одном и том же положении на изображениях со всех 5 линз). В то время как я тестировал стерео-рецитификацию с двумя объективами, которые были расположены гораздо дальше по горизонтали, чем по вертикали, cv2.stereoRectify всегда интерпретирует их так, как если бы они были разделены по вертикали. Я хочу, чтобы функция могла интерпретировать ее по горизонтали. Я видел несколько похожих вопросов, опубликованных здесь, но нигде не смог найти полезных ответов.
Редактировать: Я добавил все коэффициенты искажения и калибровочные матрицы в код для простотырепликация. Эти значения были получены с использованием большого количества калибровочных изображений и функции cv2.stereoCalibrate, но было невозможно загрузить все эти изображения и код для извлечения коэффициентов.
выходное изображение
входное изображение 1
входное изображение 2
прояснение вопроса