1、opencv相机畸变矫正

这篇具有很好参考价值的文章主要介绍了1、opencv相机畸变矫正。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

opencv相机畸变矫正

1、畸变矫正保存加载 C++

#include <opencv2\imgproc\types_c.h>
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;

Mat image, img_gray;
int BOARDSIZE[2]{ 8,11 };//棋盘格每行每列角点个数
int main()
{
	vector<vector<Point3f>> object_points;//保存棋盘格上角点的三维坐标
	vector<Point3f> obj_world_pts;//三维世界坐标
	vector<vector<Point2f>> images_points;//保存所有角点
	vector<Point2f> img_corner_points;//保存每张图检测到的角点
	vector<String> images_path;//创建容器存放读取图像路径

	string image_path = "./pic/chess118/*.png";//待处理图路径	F:/Works/C++/openCV/opencv study/Revise/Revise/Project1/
	//vector<int> point_counts; //每幅图像中的角点的数量

	glob(image_path, images_path);//读取指定文件夹下图像

	//转世界坐标系
	for (int i = 0; i < BOARDSIZE[1]; i++)
	{
		for (int j = 0; j < BOARDSIZE[0]; j++)
		{
			obj_world_pts.push_back(Point3f(j, i, 0));
		}
	}

	for (int i = 0; i < images_path.size(); i++)
	{
		image = imread(images_path[i]);
		cvtColor(image, img_gray, COLOR_BGR2GRAY);
		//检测角点
		bool found_success = findChessboardCorners(img_gray, Size(BOARDSIZE[0], BOARDSIZE[1]),
			img_corner_points,
			CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FAST_CHECK | CALIB_CB_NORMALIZE_IMAGE);

		//显示角点
		if (found_success)
		{
			//迭代终止条件
			TermCriteria criteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.001);

			//进一步提取亚像素角点
			cornerSubPix(img_gray, img_corner_points, Size(11, 11),
				Size(-1, -1), criteria);

			//绘制角点
			drawChessboardCorners(image, Size(BOARDSIZE[0], BOARDSIZE[1]), img_corner_points,
				found_success);

			object_points.push_back(obj_world_pts);//从世界坐标系到相机坐标系
			images_points.push_back(img_corner_points);

		}
		//char *output = "image";
		char text[] = "image";
		char* output = text;
		imshow(output, image);
		waitKey(200);

	}

	/*
	计算内参和畸变系数等
	*/

	Mat cameraMatrix, distCoeffs, R, T;//内参矩阵,畸变系数,旋转量,偏移量
	calibrateCamera(object_points, images_points, img_gray.size(),
		cameraMatrix, distCoeffs, R, T);

	cout << "cameraMatrix:" << endl;
	cout << cameraMatrix << endl;

	cout << "*****************************" << endl;
	cout << "distCoeffs:" << endl;
	cout << distCoeffs << endl;
	cout << "*****************************" << endl;

	cout << "Rotation vector:" << endl;
	cout << R << endl;

	cout << "*****************************" << endl;
	cout << "Translation vector:" << endl;
	cout << T << endl;



	///*
	//畸变图像校准
	//*/
	Mat src, dst;
	src = imread("./pic/chess118/100000.png");  //F:/Works/C++/openCV/opencv study/Revise/image/2.jpg
	undistort(src, dst, cameraMatrix, distCoeffs);

	char texts[] = "image_dst";
	char* dst_output = texts;
	//char *dst_output = "image_dst";
	imshow(dst_output, dst);
	waitKey(100);
	imwrite("./pic/save/1.png", dst);  //保存

	destroyAllWindows();//销毁显示窗口
	system("pause");
	return 0;
}

2、畸变矫正保存加载 python

2.1保存矩阵

import cv2 as cv
import numpy as np
import glob
import os
import scipy.io as scio
# 循环中断
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# 标定板交叉点的个数
row = 8
column = 11
objp = np.zeros((row * column, 3), np.float32)
objp[:, :2] = np.mgrid[0:row, 0:column].T.reshape(-1, 2)
objp=objp*0.02
objpoints = []  # 实际空间3D点
imgpoints = []  # 图像中2D点

# 批量读取图片
images = glob.glob('./pic/chess118/*.png')  # .jpg应该改为.png
# images = glob.glob('./pic/chess68/*.jpg')  # .jpg应该改为.png
i=0
for fname in images:
    img = cv.imread(fname)
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    # 找标定板角点
    ret, corners = cv.findChessboardCorners(gray, (row, column), None)

    if ret == True:
        objpoints.append(objp)

        corners2 = cv.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        imgpoints.append(corners2)

        cv.drawChessboardCorners(img, (row, column), corners, ret)
        i += 1;
        # cv.imwrite('./pic/corners/conimg' + str(i) + '.jpg', img)
        cv.imshow('img', img)
        cv.waitKey(500)
cv.destroyAllWindows()
# 标定相机
ret, Matrix, dist, rvecs, tvecs = cv.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

#对文件夹下的图片进行矫正并保存到save目录下
datadir = "./pic/chess118/"

path = os.path.join(datadir)
img_list = os.listdir(path)

for i in img_list:
    img = cv.imread(os.path.join(path, i))
    h, w = img.shape[:2]
    newMatrix, roi = cv.getOptimalNewCameraMatrix(Matrix, dist, (w, h), 1, (w, h))  # 矫正图像

    dst = cv.undistort(img, Matrix, dist, None, newMatrix)
    x, y, w, h = roi
    dst = dst[y:y + h, x:x + w]
    cv.imwrite('./pic/save/' + i, dst)

# 计算重投影误差
tot_error = 0
for i in range(len(objpoints)):
    imgpoints2, _ = cv.projectPoints(objpoints[i], rvecs[i], tvecs[i], Matrix, dist)
    error = cv.norm(imgpoints[i], imgpoints2, cv.NORM_L2) / len(imgpoints2)
    tot_error += error

#保存矫正的内参和畸变参数,以供下次使用

print("------------------保存内参和畸变参数-------------------")
#读取矩阵
dataFile1 = './neican.mat'
dataFile2='./jican.mat'
scio.savemat(dataFile1, {'train':Matrix})
scio.savemat(dataFile2, {'train':dist})

# #读取保存矩阵,矩阵的名字为train.mat
# data = scio.loadmat(dataFile1)
# data2 = scio.loadmat(dataFile2)
# neican = data['train']
# jican = data2['train']
# print("内参:\n", neican)  # 内参数矩阵
# print("畸参:\n",jican)
print("------------保存完成----------------------------")

print("------------------各个校准参数-------------------")
# 输出参数
print('ret:\n', ret)
print('mtx:\n', Matrix)
print('dist:\n', dist)
print('rvecs:\n', rvecs)
print('tvecs:\n', tvecs)
print("total error: ", tot_error / len(objpoints))

2.1直接使用保存的矩阵

import cv2 as cv
import numpy as np
import glob
import os
import scipy.io as scio
print("------------------从文件加载内参和畸变参数-------------------")
#读取矩阵
dataFile1 = './neican.mat'  
dataFile2='./jican.mat'
data = scio.loadmat(dataFile1)
data2 = scio.loadmat(dataFile2)
Matrix = data['train']
dist = data2['train']
print("内参:\n", Matrix)  # 内参数矩阵
print("畸参:\n",dist)
print("------------加载完成----------------------------")

print("------------用内参和畸参对图片进行矫正----------------------------")

#对文件夹下的图片进行矫正并保存到save目录下
datadir = "./pic/chess118/"

path = os.path.join(datadir)
img_list = os.listdir(path)

for i in img_list:
    img = cv.imread(os.path.join(path, i))
    h, w = img.shape[:2]
    newMatrix, roi = cv.getOptimalNewCameraMatrix(Matrix, dist, (w, h), 1, (w, h))  # 矫正图像

    dst = cv.undistort(img, Matrix, dist, None, newMatrix)
    x, y, w, h = roi
    dst = dst[y:y + h, x:x + w]
    cv.imwrite('./pic/save/' + i, dst)

print("------------矫正完成,矫正后的图片保存在save文件夹----------------------------")

3、效果

1、opencv相机畸变矫正文章来源地址https://www.toymoban.com/news/detail-514246.html

到了这里,关于1、opencv相机畸变矫正的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 无人机红外相机的畸变矫正

    在项目开展过程中,发现大疆M30T的红外相机存在比较明显的畸变问题,因此需要对红外图像进行畸变矫正。在资料检索过程中,发现对红外无人机影像矫正的资料较少,对此,我从相机的成像原理角度出发,探索出一种效果尚可的解决思路,遂以本文记录如下。 目前采用的

    2024年02月04日
    浏览(58)
  • 相机的内外参数标定和畸变矫正原理和代码

    相机的成像过程实质上是坐标系转换。首先空间中的点坐标由世界坐标系转换到相机坐标系,然后将其投影到成像平面(图像物理坐标系),最后再将成像平面上的数据转换到图像像素坐标系。但是由于透镜制造精度及组装工艺的差别会引入畸变,导致原始图像的失真。镜头

    2024年04月16日
    浏览(45)
  • opencv图像畸变矫正:源码学习

    参考资料:相机标定(4) 矫正畸变 undistort()和initUndistortRectifyMap() 背景: opencv提供了直接进行畸变矫正的代码,因在项目中需要使用畸变矫正,因此研究一下opencv中畸变矫正的相关接口与代码,便于学习提升与二次开发。 opencv在文档中对相机标定与畸变矫正的原理做了简单

    2024年02月10日
    浏览(47)
  • python opencv多路视频畸变矫正与显示

    用于测试的计算机配置如下: 计算机为八核Intel(R) Xeon(R) CPU E3-1230 V2 @ 3.30GHz 注意:文中所说的cpu使用率是指该算法占用的cpu使用率 测试用的视频规格为1920*1080 做一路视频的去除畸变 cpu的使用率为126.9% 多路视频去除畸变显示 三路视频去除畸变显示代码如下: import cv2 import numpy

    2023年04月09日
    浏览(37)
  • OpenCvSharp (C# OpenCV) 二维码畸变矫正--基于透视变换(附源码)

        本文主要介绍如何使用OpenCvSharp中的透视变换来实现二维码的畸变矫正。     由于CSDN文章中贴二维码会导致显示失败,大家可以直接点下面链接查看图片:     C# OpenCV实现二维码畸变矫正--基于透视变换 (详细步骤 + 代码)      讲解实现步骤之前先看下效果(左边是原图

    2024年02月15日
    浏览(39)
  • 使用python-opencv对双目摄像头进行立体视觉图像矫正,去畸变

            1、一张棋盘图         可以直接从opencv官方github下载,这是一个拥有10*7个格子的棋盘,共有 9*6个角点,每个格子24mm ,本文所使用的就是这一个棋盘。你需要将它打印在A4纸上用于后续使用。(也可以根据官方教程自行设置棋盘大小OpenCV: Create calibration pattern)

    2024年02月10日
    浏览(50)
  • 学习笔记:利用usb_cam进行单目标定与畸变矫正(笔记本摄像头 or usb相机)

    一个刚入门视觉的学习笔记,怕哪天系统崩了找不回笔记了,故上传到博客方便保留。 1、准备工作(安装usb_cam) 1)创建文件夹 2)下载编译安装usb_cam包(该包能将摄像头的图像通过sensor_msgs::Image消息发布)    2、可以通过ls/dev/video*来查看电脑的设备号来选择外接或笔记本

    2024年02月07日
    浏览(43)
  • 【相机标定】opencv python 标定相机内参时不计算 k3 畸变参数

    畸变参数 k3 通常用于描述径向畸变的更高阶效应,即在需要高精度的应用中可以用到,一般的应用中 k1, k2 足矣。 常见的应用中, orbslam3 中是否传入 k3 是可选的,而 kalibr 标定中则只需要传入 k1, k2 。但计算 k3 时的 k1, k2 不等于不计算 k3 时的 k1, k2 ,因此需要学会两种场景下

    2024年02月09日
    浏览(40)
  • opencv对相机进行畸变校正,及校正前后的坐标对应

    目前有个项目,需要用到热成像相机。但是这个热成像相机它的畸变比较厉害,因此需要用标定板进行标定,从而消除镜头畸变。 同时需要实现用户用鼠标点击校正后的画面后,显示用户点击位置的像素所代表的温度。 另外热成像sdk中还有个功能:选定一个rect,可以返回这

    2024年02月14日
    浏览(46)
  • 【OpenCV】双目相机标定、极线矫正、SIFT匹配以及深度估计

    双目标定有很多示例,就不多讲,直接放代码 有个小技巧就是可以先使用matlab标定箱试一下,把误差过大的左右相机图片剔除,保证精度 匹配: 过滤: 这里过滤条件2需要注意一下 ,因为我们是进行了极线校正的,所以理论上左右视图相同的点应该在同一条水平线上,即像

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包