LoginSignup
2
2

More than 3 years have passed since last update.

[C#/OpenCvSharp] キャリブレーション

Last updated at Posted at 2020-06-26
var src = new Mat(@".\dot_Bobbin_img.png", ImreadModes.Grayscale);

var patternSize = new Size(18, 13);

var centers = new Mat();
var found = Cv2.FindCirclesGrid(src, patternSize, centers, FindCirclesGridFlags.SymmetricGrid);

var points_img = new Mat();
Cv2.CvtColor(src.Clone(), points_img, ColorConversionCodes.GRAY2BGR);

Cv2.DrawChessboardCorners(points_img, patternSize, centers, true);

Cv2.ImShow("points", points_img);
Cv2.WaitKey();

int left_margin = 26;
int top_margin = 18;
int interval = 44;

var object_points = new Mat<Point3f>();
for (int j = 0; j < patternSize.Height; j++)
{
    for (int i = 0; i < patternSize.Width; i++)
    {
        object_points.Add(new Point3f(left_margin + i * interval, top_margin + j * interval, 0));
    }
}

var imageSize = src.Size();

var cameraMatrix = new Mat<double>(3, 3);
var distCoeffs = new Mat<double>(5, 1);

Cv2.CalibrateCamera(new[] { object_points }, new[] { centers }, imageSize, cameraMatrix, distCoeffs, out Mat[] rvecs, out Mat[] tvecs);

var newImageSize = new Size();
var newCameraMatrix = Cv2.GetOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, newImageSize, out Rect validPixROI);

var data = new Mat(@".\dot_Bobbin_img.png", ImreadModes.Grayscale);

var temp_img = new Mat();
Cv2.Undistort(data, temp_img, cameraMatrix, distCoeffs, newCameraMatrix);

var rotation = new Mat();
Cv2.Rodrigues(rvecs[0], rotation);

var transRot = new Mat<double>(3, 3);
rotation.Col(0).CopyTo(transRot.Col(0));
rotation.Col(1).CopyTo(transRot.Col(1));

var transData = new double[3,3] { { 0, 0, tvecs[0].At<double>(0) },{ 0, 0, tvecs[0].At<double>(1) }, { 0, 0, tvecs[0].At<double>(2) } };
var translate = InputArray.Create(transData).GetMat();
translate.Col(2).CopyTo(transRot.Col(2));

var dst_img = new Mat();
var m = newCameraMatrix * transRot;
Cv2.WarpPerspective(temp_img, dst_img, m, newImageSize, InterpolationFlags.WarpInverseMap);

Cv2.ImShow("temp", temp_img);
Cv2.WaitKey();

Cv2.ImShow("dst", dst_img);

33661a48b48dca01f98a042375aba368[1].png
c83a5792b630f2b553904eb8b601e50a[1].png
fb3273acdc75324b4c4ede4e3b11bef8[1].png
41534924ae29ab8249ea3a1a3bf25e62[1].png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2