用 OpenCVSharp 4.5 跑一遍 OpenCV 官方教程。
原OpenCV官方教程链接:挂啦(2021-7-19)
using System;
using OpenCvSharp;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class tutorial54 : ITutorial
{
enum Pattern { CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID };
RNG rng = new RNG();
private Scalar randomColor(RNG rng)
{
int icolor = (int)rng;
return new Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255);
}
private Point2d[] ConvertToPoint2d(Point2f[] input)
{
Point2d[] output = new Point2d[input.Length];
for (int i = 0; i < input.Length; i++)
{
output[i] = new Point2d(input[i].X, input[i].Y);
}
return output;
}
private void perspectiveCorrection(string img1Path, string img2Path, Size patternSize, RNG rng)
{
Mat img1 = Cv2.ImRead(img1Path);
Mat img2 = Cv2.ImRead(img2Path);
//! [find-corners]
Point2f[] corners1, corners2;
//Mat corners_mat1 = new Mat();
//Mat corners_mat2 = new Mat();
bool found1 = Cv2.FindChessboardCorners(img1, patternSize, out corners1);
bool found2 = Cv2.FindChessboardCorners(img2, patternSize, out corners2);
//! [find-corners]
if (!found1 || !found2)
{
Console.WriteLine("Error, cannot find the chessboard corners in both images.");
return;
}
//! [estimate-homography]
Mat H = Cv2.FindHomography(ConvertToPoint2d(corners1), ConvertToPoint2d(corners2));
Console.WriteLine("H:\n", H);
//! [estimate-homography]
//! [warp-chessboard]
Mat img1_warp = new Mat();
Cv2.WarpPerspective(img1, img1_warp, H, img1.Size());
//! [warp-chessboard]
Mat img_draw_warp = new Mat();
Cv2.HConcat(img2, img1_warp, img_draw_warp);
Cv2.ImShow("Desired chessboard view / Warped source chessboard view", img_draw_warp);
//! [compute-transformed-corners]
Mat img_draw_matches = new Mat();
Cv2.HConcat(img1, img2, img_draw_matches);
for (int i = 0; i < corners1.Length; i++)
{
Mat pt1 = new Mat(3, 1, MatType.CV_64F, new double[] { corners1[i].X, corners1[i].Y, 1 });
Mat pt2 = H * pt1;
pt2 /= pt2.At<double>(2);
Point end = new Point((int)(img1.Cols + pt2.At<double>(0)), (int)pt2.At<double>(1));
Cv2.Line(img_draw_matches, (Point)corners1[i], end, randomColor(rng), 2);
}
Cv2.ImShow("Draw matches", img_draw_matches);
Cv2.WaitKey();
//! [compute-transformed-corners]
}
public void Run()
{
RNG rng = new RNG(0xFFFFFFFF);
int width = 9;
int height = 6;
string image1 = @"I:\csharp\images\left02.jpg";
string image2 = @"I:\csharp\images\left01.jpg";
Size patternSize = new Size(width, height);
perspectiveCorrection(image1, image2, patternSize, rng);
}
}
}