opencv 图像矫正,python+opencv图像处理
本文主要介绍利用pythonopencv实现对失真图像的校正。用示例代码非常详细的介绍,有一定的参考价值,感兴趣的朋友可以参考一下。
代码:
__Author__=Shliang
_ _ Email _ _= shliang 0603 @ Gmail.com
导入操作系统
导入cv2
将numpy作为np导入
从tqdm导入tqdm
def不失真(帧):
fx=685.646752
cx=649.107905
fy=676.658033
cy=338.054431
k1,k2,p1,p2,k3=-0.363219,0.093818,0.006178,-0.003714,0.0
#从相机坐标系到像素坐标系的转换矩阵
k=np.array([
[fx,0,cx],
[0,fy,cy],
[0, 0, 1]
])
#失真系数
d=np.array([
k1,k2,p1,p2,k3
])
h,w=frame.shape[:2]
mapx,mapy=cv2 . initundistortrectifymap(k,d,None,k,(w,h),5)
返回cv2.remap(frame,mapx,mapy,cv2。INTER _线性)
#纠正摄像机实时视频流的失真
def失真_校正_cam():
cap=cv2。视频捕获(0)
while (cap.isOpened()):
ret,frame=cap.read()
un distort _ frame=un distort(frame)
compare=np.hstack((frame,undistort _ frame))
cv2.imshow(帧,比较)
if cv2 . wait key(1)0x ff==ord( q ):
破裂
cap.release()
cv2.destroyAllWindows()
#对目录中的所有图片进行失真校正,并保存失真的图片。
def失真_校正_图像(输入_方向,输出_方向):
in_imgs=os.listdir(input_dir)
对于tqdm(in_imgs):中的img_name
image=cv2 . im read(OS . path . join(input _ dir,img_name))
distroted_img=未失真(图像)
cv2 . im write(OS . path . join(output _ dir,img_name),distroted_img)
if __name__==__main__:
input _ dir=/home/SHL/extract _ ROS bag _ data/0324 _ bags/ply cal _ calib/root/images
output _ dir=/home/SHL/extract _ ROS bag _ data/0324 _ bags/ply cal _ calib/root/distro _ imgs
#失真_校正_图像(输入_方向,输出_方向)
失真_校正_cam()
纠正图片:
原图:
校正后的图片:
拍摄的相机图片校正效果:
从上面的变脸可以看出,左边是未矫正的图,右边是矫正后的图:
校正后的图片会被裁剪,很明显图片中的信息被裁剪了。例如,左边的椅子被裁剪了。校正后的图片和原始图片保持相同的分辨率:640x480。但是,为什么会看到画面横向拉伸?这是因为在校准相机内部参考时,图片的分辨率设置为1280x720=16:9。但是opencv读数摄像头的默认分辨率是640x480=4:3,两者的比例不一样,所以肯定会有拉伸来解决拉伸,就是在读数摄像头的时候,把摄像头的分辨率设置成和校准的时候一样的分辨率,设置成1280x720。以下是在opencv中读取相机时如何设置相机分辨率:
#纠正摄像机实时视频流的失真
def失真_校正_cam():
cap=cv2。视频捕获(0)
#获取相机读取的图片的宽度和高度
width=cap.get(3)
height=cap.get(4)
fps=cap.get(5)
打印(宽度、高度、每秒帧数)# 640.0 480.0 30.0
#在这里,将相机的分辨率更改为1280x720,这与我们在校准中使用的分辨率相同。
第一套(31280)
第一组(4720)
width=cap.get(3)
height=cap.get(4)
打印(宽度、高度、每秒帧数)# 1280.0 720.0 30.0
while (cap.isOpened()):
ret,frame=cap.read()
打印(框架.形状)
un distort _ frame=un distort(frame)
compare=np.hstack((frame,undistort _ frame))
cv2.imshow(帧,比较)
if cv2 . wait key(1)0x ff==ord( q ):
破裂
cap.release()
cv2.destroyAllWindows()
重置分辨率后,可以看到校正前后图像对比度后,几乎没有水平或垂直拉伸!
参考:
https://blog . csdn . net/weixin _ 40516558/article/details/103494029
https://blog.csdn.net/guaiderzhu1314/article/details/96306509
https://www.codenong.com/cs110623399/
这就是这篇关于用python opencv实现校正失真图像的文章。关于使用python opencv校正扭曲图像的更多信息,请搜索热门IT软件开发工作室之前的文章或继续浏览下面的相关文章。希望大家以后多多支持热门IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。