用 OpenCVSharp 4.5 跑一遍 OpenCV 官方教程
原OpenCV官方教程链接:OpenCV: Detecting corners location in subpixels
核心函数:cv::cornerSubPix
using System;
using OpenCvSharp;
namespace ConsoleApp1
{
class tutorial46 : ITutorial
{
static Mat src, src_gray = new Mat();
static int maxCorners = 10;
static int maxTrackbar = 25;
static RNG rng = new RNG(12345);
static string source_window = "Image";
public void Run()
{
src = Cv2.ImRead(@"I:\csharp\images\appleleaf.jpg");
if (src.Empty())
{
Console.WriteLine("Could not open or find the image!");
return;
}
Cv2.CvtColor(src, src_gray, ColorConversionCodes.BGR2GRAY);
Cv2.NamedWindow(source_window);
Cv2.CreateTrackbar("Max corners:", source_window, ref maxCorners, maxTrackbar, goodFeaturesToTrack_Demo);
Cv2.ImShow(source_window, src);
goodFeaturesToTrack_Demo(0, IntPtr.Zero);
Cv2.WaitKey();
return;
}
private void goodFeaturesToTrack_Demo(int pos, IntPtr usedata)
{
maxCorners = Math.Max(maxCorners, 1);
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3, gradientSize = 3;
bool useHarrisDetector = false;
double k = 0.04;
Mat copy = src.Clone();
Point2f[] corners = Cv2.GoodFeaturesToTrack(src_gray,
maxCorners,
qualityLevel,
minDistance,
new Mat(),
blockSize,
useHarrisDetector,
k);
Console.WriteLine("** Number of corners detected:{0} ", corners.Length);
int radius = 4;
for (int i = 0; i < corners.Length; i++)
{
Cv2.Circle(copy, (Point)corners[i], radius, new Scalar(rng.Uniform(0, 255), rng.Uniform(0, 256), rng.Uniform(0, 256)), Cv2.FILLED);
}
Cv2.NamedWindow(source_window);
Cv2.ImShow(source_window, copy);
Size winSize = new Size(5, 5);
Size zeroZone = new Size(-1, -1);
TermCriteria criteria = new TermCriteria(CriteriaTypes.Eps | CriteriaTypes.Count, 40, 0.001);
Cv2.CornerSubPix(src_gray, corners, winSize, zeroZone, criteria);
for (int i = 0; i < corners.Length; i++)
{
Console.WriteLine(" -- Refined Corner [{0}] ({1},{2})", i, corners[i].X, corners[i].Y);
}
}
}
}