用OpenCVSharp 跑一遍OpenCV官方教程
原官方教程链接:OpenCV: Histogram Comparison
核心函数:compareHist
using System;
using OpenCvSharp;
namespace ConsoleApp1
{
class tutorial21 : ITutorial
{
public void Run()
{
using (Mat src_base = new Mat("I:\\csharp\\images\\hand.jpg", ImreadModes.AnyColor))
using (Mat src_test1 = new Mat("I:\\csharp\\images\\hand_test1.jpg", ImreadModes.AnyColor))
using (Mat src_test2 = new Mat("I:\\csharp\\images\\hand_test2.jpg", ImreadModes.AnyColor))
using (Mat hsv_base = new Mat())
using (Mat hsv_test1 = new Mat())
using (Mat hsv_test2 = new Mat())
{
Cv2.CvtColor(src_base, hsv_base, ColorConversionCodes.BGR2HSV);
Cv2.CvtColor(src_test1, hsv_test1, ColorConversionCodes.BGR2HSV);
Cv2.CvtColor(src_test2, hsv_test2, ColorConversionCodes.BGR2HSV);
Mat hsv_half_down = hsv_base[new Range(hsv_base.Rows / 2, hsv_base.Rows), new Range(0, hsv_base.Cols)];
int h_bins = 50, s_bins = 60;
int[] histSize = { h_bins, s_bins };
// hue varies from 0 to 179, saturation from 0 to 255
float[] h_ranges = { 0, 180 };
float[] s_ranges = { 0, 256 };
float[][] ranges = { h_ranges, s_ranges };
// Use the 0-th and 1-st channels
int[] channels = { 0, 1 };
Mat hist_base = new Mat();
Mat hist_half_down = new Mat();
Mat hist_test1 = new Mat();
Mat hist_test2 = new Mat();
Cv2.CalcHist(new Mat[] { hsv_base }, channels, null, hist_base, 2, histSize, ranges, true, false);
Cv2.Normalize(hist_base, hist_base, 0, 1, NormTypes.MinMax, -1, null);
Cv2.CalcHist(new Mat[] { hsv_half_down }, channels, null, hist_half_down, 2, histSize, ranges, true, false);
Cv2.Normalize(hist_half_down, hist_half_down, 0, 1, NormTypes.MinMax, -1, null);
Cv2.CalcHist(new Mat[] { hsv_test1 }, channels, null, hist_test1, 2, histSize, ranges, true, false);
Cv2.Normalize(hist_test1, hist_test1, 0, 1, NormTypes.MinMax, -1, null);
Cv2.CalcHist(new Mat[] { hsv_test2 }, channels, null, hist_test2, 2, histSize, ranges, true, false);
Cv2.Normalize(hist_test2, hist_test2, 0, 1, NormTypes.MinMax, -1, null);
Console.WriteLine("Method \t Perfect \t Base - Half \t Base - Test(1) \t Base - Test(2)");
for (int compare_method = 0; compare_method < 4; compare_method++)
{
double base_base = Cv2.CompareHist(hist_base, hist_base, (HistCompMethods)compare_method);
double base_half = Cv2.CompareHist(hist_base, hist_half_down, (HistCompMethods)compare_method);
double base_test1 = Cv2.CompareHist(hist_base, hist_test1, (HistCompMethods)compare_method);
double base_test2 = Cv2.CompareHist(hist_base, hist_test2, (HistCompMethods)compare_method);
Console.WriteLine("{0}\t{1:#.000}\t{2:#.000}\t{3:#.000}\t{4:#.000} ",
((HistCompMethods)compare_method).ToString(),
base_base,
base_half,
base_test1,
base_test2
);
}
Console.ReadKey();
Console.WriteLine("Done");
}
}
}
}
输入图片
输出:
在EXCEL里看清楚一点: