InRange函数

 

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);
            }
        }
    }
}

运行代码后结果是这样的:InRange函数_第1张图片

dst处理后全是黑色,去github上问opencvsharp的作者,他给我的回复如下:

InRange函数_第2张图片

他的意思是因为dst图像的像素格式不对,导致转换成mat的 时候,格式不是InRange函数要求的格式。

然后修改代码,代码和运行效果如下:InRange函数_第3张图片

 

你可能感兴趣的:(C#,OpencvSharp)