using OpenCvSharp;using OpenCvSharp.Extensions;using static OpenCvSharp.Cv2;using System.Drawing;namespace RcoloR{ class Program { static Bitmap Mybmp = new Bitmap("E:/CVIMG/lenna.png"); static void Main(string[] args) { using (new Window("SRC", WindowMode.Normal, Mybmp.ToMat())) ; //source image Prtsc(Mybmp, out Bitmap dst); //crop image MyInrange(dst,out Bitmap dstbmp); // Inrange using (new Window("DST", WindowMode.Normal, dstbmp.ToMat())); //show the inranged image WaitKey(); } static void Prtsc(Bitmap src, out Bitmap dst) // crop image { dst = new Bitmap(300,300); using (Graphics g = Graphics.FromImage(dst)) { g.DrawImage(src,new Rectangle(0,0,300,300),new Rectangle(0,0,300,300),GraphicsUnit.Pixel); } } static void MyInrange(Bitmap bmpsrc,out Bitmap dstbmp) // Cv2.Inrange(); { using (Mat src = bmpsrc.ToMat()) using (Mat dst = new Mat()) { Scalar low_value = new Scalar(100, 100, 100); Scalar high_value = new Scalar(255, 255, 255); InRange(src, low_value, high_value, dst); dstbmp = dst.ToBitmap(); float sres = CountNonZero(dst) / (src.Width * src.Height * 1.0f ) * 100; System.Console.WriteLine(sres); } } }}
运行代码后结果是这样的:
dst处理后全是黑色,去github上问opencvsharp的作者,他给我的回复如下:
他的意思是因为dst图像的像素格式不对,导致转换成mat的 时候,格式不是InRange函数要求的格式。
然后修改代码,代码和运行效果如下: