OpenCV旋转摄像头画面后左上偏移、右下留空白的问题求助
解决OpenCV摄像头画面旋转偏移及空白问题
嘿,我来帮你搞定这个画面偏移的问题!你遇到的情况其实是因为手动用旋转矩阵做90度旋转时,没有处理好旋转后图像的居中对齐,导致画面偏移到左上角,留下右侧和底部的空白。下面给你两种解决方案,推荐第一种,简单又可靠:
方案一:用OpenCV内置的90度旋转函数(推荐)
对于90°、180°、270°这类固定角度的旋转,OpenCV提供了专门的cv2.rotate()函数,它会自动处理图像尺寸和居中,完全不会出现偏移问题。把你代码里的旋转部分替换成下面的代码就行:
import cv2 cap = cv2.VideoCapture(0) while cap.isOpened(): ret, img = cap.read() if not ret: print('no camera connected!') break # 顺时针旋转90度 img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 水平翻转(镜像画面) img = cv2.flip(img, 1) cv2.imshow('camera-0', img) if cv2.waitKey(1)&0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
方案二:调整手动旋转矩阵的平移量(适合理解原理)
如果你坚持想用cv2.getRotationMatrix2D()和cv2.warpAffine(),那需要调整旋转矩阵里的平移参数,让旋转后的图像居中显示在输出画布上。原理是:旋转后图像的中心和输出画布的中心需要对齐,所以要计算额外的平移量:
import cv2 import numpy as np cap = cv2.VideoCapture(0) while cap.isOpened(): ret, img = cap.read() if not ret: print('no camera connected!') break h, w = img.shape[:2] center = (w/2, h/2) # 获取90度旋转矩阵 M = cv2.getRotationMatrix2D(center, 90, 1) # 计算旋转后图像的新边界,调整平移量 cos = np.abs(M[0, 0]) sin = np.abs(M[0, 1]) new_w = int((h * sin) + (w * cos)) new_h = int((h * cos) + (w * sin)) # 调整矩阵的平移部分,让图像居中 M[0, 2] += (new_w / 2) - center[0] M[1, 2] += (new_h / 2) - center[1] # 执行旋转,输出尺寸用计算后的新宽高 img = cv2.warpAffine(img, M, (new_w, new_h)) # 水平翻转 img = cv2.flip(img, 1) cv2.imshow('camera-0', img) if cv2.waitKey(1)&0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
为什么原来的代码会偏移?因为你用(h, w)作为输出尺寸,但旋转后的图像在这个尺寸的画布上没有居中,getRotationMatrix2D默认只计算旋转,没有自动调整平移来对齐中心,所以画面就跑到左上角去了。
你可以先试试方案一,绝对能解决你的问题,而且代码更简洁!
内容的提问来源于stack exchange,提问作者YEEN
相关产品推荐
相关产品推荐

