在OpenCV(Python)中使用校正失真裁剪图像

在OpenCV(Python)中使用校正失真裁剪图像,python,opencv,computer-vision,crop,distortion,Python,Opencv,Computer Vision,Crop,Distortion,我一直在其他帖子中寻找回复,并尝试了几种方法来获得回复,但我找不到任何解决问题的方法。我试图纠正图像中的光学失真,我得到了它,但现在我想裁剪我的图像,以便删除结果图像中弯曲的黑色边框。总之,这是我的问题: 我想这样裁剪: 我已尝试使用以下代码进行裁剪: h, w = corrected_img.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(cameraMTX,distortionCoeffs,(w,h),1,(w,h

我一直在其他帖子中寻找回复,并尝试了几种方法来获得回复,但我找不到任何解决问题的方法。我试图纠正图像中的光学失真,我得到了它,但现在我想裁剪我的图像,以便删除结果图像中弯曲的黑色边框。总之,这是我的问题:

我想这样裁剪:

我已尝试使用以下代码进行裁剪:

h,  w = corrected_img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(cameraMTX,distortionCoeffs,(w,h),1,(w,h))
x,y,w,h = roi
desired_result = corrected_img[y:y+h, x:x+w]
但不幸的是,
roi
总是取
(0,0,0,0)

有人能帮我吗


预先感谢。

< P>因为空隙部分在图像的中间有最大/最小值,你可以寻找中间线,看看有什么颜色变化。下图可能会澄清这一点:

您只需找到图中所示的
x1
y1
x2
y2
。这可以通过以下方式完成:

import cv2
# Reads the image in grayscale
img = cv2.imread('Undistorted.jpg', 0)
h, w = img.shape
x1, x2, y1, y2 = (0,0,0,0)

# Color threshold of the void part
void_th = 10

# List of colors in the vertical an horizontal lines that cross the image in the middle
vertical = [img[i, int(w/2)] for i in range(h)]
horizontal = [img[int(h/2), i] for i in range(w)]

# Reverses both lists
vertical_rev = vertical[::-1]
horizontal_rev = horizontal[::-1]

# Looks when the change of color is done
for i in range(2,h):
    if vertical[i] > void_th and y1 == 0:
        y1 = i
    if vertical_rev[i] > void_th and y2 == 0:
        y2 = i
    if y1 != 0 and y2 != 0:
        break
for i in range(2,w):
    if horizontal[i] > void_th and x1 == 0:
        x1 = i
    if horizontal_rev[i] > void_th and x2 == 0:
        x2 = i
    if x1 != 0 and x2 != 0:
        break

desired_result = img[y1:h-y2, x1:w-x2]
cv2.imshow('Crop', desired_result)

我所做的是中间线中像素颜色的列表,然后将它们循环,直到颜色超过阈值(0是黑色,255是白色)。当检测到第一个颜色变化的像素时,将存储位置,循环将中断。输出为裁剪后的图像:

注意:由于边界线,我从位置2开始循环,对于原始图像,这是不需要的


希望这有帮助

谢谢你的回复。当alpha=0时,只得到左侧中间部分的一小部分区域。它不工作。你能发布你的代码来修复失真吗?这正是我想要的。。。裁剪和修复变形…惊人的答案,我的朋友。充分的工作和精彩的解释。恭喜你,非常感谢!非常感谢你!我刚刚意识到空的部分不一定是对称的,所以你也必须循环反向列表。刚刚编辑!