用 OpenCVSharp4.5 跑一遍 OpenCV 官方教程。
原 OpenCV 官方教程链接: OpenCV: Harris corner detector
核心函数:cv::cornerHarris
using System;
using OpenCvSharp;
namespace ConsoleApp1
{
class tutorial43 : ITutorial
{
static int thresh = 200;
static int max_thresh = 255;
Mat src = new Mat();
Mat src_gray = new Mat();
public void Run()
{
src = Cv2.ImRead(@"I:\csharp\images\building2.jpg");
if (src.Empty())
{
Console.WriteLine("Could not open or find the image!");
return;
}
Cv2.CvtColor(src, src_gray, ColorConversionCodes.BGR2GRAY);
Cv2.NamedWindow("Source", WindowFlags.Normal);
Cv2.CreateTrackbar("Threshold", "Source", ref thresh, max_thresh, cornerHarris_demo);
Cv2.ImShow("Source", src);
cornerHarris_demo(0, IntPtr.Zero);
Cv2.WaitKey();
}
void cornerHarris_demo(int pos, IntPtr userdata)
{
int blockSize = 2;
int apertureSize = 3;
double k = 0.04;
Mat dst = Mat.Zeros(src.Size(), MatType.CV_32FC1);
Cv2.CornerHarris(src_gray, dst, blockSize, apertureSize, k);
Mat dst_norm = new Mat();
Mat dst_norm_scaled = new Mat();
Cv2.Normalize(dst, dst_norm, 0, 255, NormTypes.MinMax, MatType.CV_32FC1, new Mat());
Cv2.ConvertScaleAbs(dst_norm, dst_norm_scaled);
for (int i = 0; i < dst_norm.Rows; i++)
{
for (int j = 0; j < dst_norm.Cols; j++)
{
if ((int)dst_norm.At<float>(i, j) > thresh)
{
Cv2.Circle(dst_norm_scaled, j, i, 5, new Scalar(0), 2, LineTypes.Link8, 0);
}
}
}
Cv2.NamedWindow("Corners");
Cv2.ImShow("Corners", dst_norm_scaled);
}
}
}