欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#利用OpenCvSharp實現(xiàn)玉米粒計數(shù)

 更新時間:2023年11月09日 15:57:55   作者:天天代碼碼天天  
這篇文章主要為大家詳細(xì)介紹了C#如何結(jié)合OpenCVSharp4實現(xiàn)玉米粒計數(shù),文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價值,需要的小伙伴可以參考下

效果

項目

代碼

using OpenCvSharp;
using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace OpenCvSharp_Demo
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
 
        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
 
        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
 
        Mat image;
        Mat result_image;
 
        StringBuilder sb = new StringBuilder();
 
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
 
            pictureBox1.Image = null;
            pictureBox2.Image = null;
            textBox1.Text = "";
 
            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            image = new Mat(image_path);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //test
            image_path = "test_img/1.jpg";
            image = new Mat(image_path);
            pictureBox1.Image = new Bitmap(image_path);
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            if (image_path == "")
            {
                return;
            }
            textBox1.Text = "檢測中,請稍等……";
            pictureBox2.Image = null;
            Application.DoEvents();
 
            result_image = image.Clone();
 
            //二值化操作
            Mat grayimg = new Mat();
            Cv2.CvtColor(image, grayimg, ColorConversionCodes.BGR2GRAY);
            Mat BinaryImg = new Mat();
            Cv2.Threshold(grayimg, BinaryImg, 240, 255, ThresholdTypes.Binary);
            //Cv2.ImShow("二值化", BinaryImg);
 
            //腐蝕
            Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(15, 15));
            Mat morhImage = new Mat();
            Cv2.Dilate(BinaryImg, morhImage, kernel, null, 2);
            //Cv2.ImShow("morphology", morhImage);
 
            //距離變換:用于二值化圖像中的每一個非零點距自己最近的零點的距離,距離變換圖像上越亮的點,代表了這一點距離零點的距離越遠(yuǎn)
            Mat dist = new Mat();
            Cv2.BitwiseNot(morhImage, morhImage);
            /*
            OpenCV中,函數(shù)distanceTransform()用于計算圖像中每一個非零點像素與其最近的零點像素之間的距離,
            輸出的是保存每一個非零點與最近零點的距離信息,圖像上越亮的點,代表了離零點的距離越遠(yuǎn)。
            用途:
            可以根據(jù)距離變換的這個性質(zhì),經(jīng)過簡單的運算,用于細(xì)化字符的輪廓和查找物體質(zhì)心(中心)。
            */
            /*
            距離變換的處理圖像通常都是二值圖像,而二值圖像其實就是把圖像分為兩部分,即背景和物體兩部分,物體通常又稱為前景目標(biāo)。
            通常我們把前景目標(biāo)的灰度值設(shè)為255(即白色),背景的灰度值設(shè)為0(即黑色)。
            所以定義中的非零像素點即為前景目標(biāo),零像素點即為背景。
            所以圖像中前景目標(biāo)中的像素點距離背景越遠(yuǎn),那么距離就越大,如果我們用這個距離值替換像素值,那么新生成的圖像中這個點越亮。
            */
            //User:用戶自定義
            //L1:  曼哈頓距離
            //L2:  歐式距離
            //C:   棋盤距離
            Cv2.DistanceTransform(morhImage, dist, DistanceTypes.L1, DistanceTransformMasks.Mask3);
            Cv2.Normalize(dist, dist, 0, 1.0, NormTypes.MinMax);   //范圍在0~1之間
            //Cv2.ImShow("distance", dist);
 
            //形態(tài)學(xué)處理
            Mat MorphImg = new Mat();
            dist.ConvertTo(MorphImg, MatType.CV_8U);
            Cv2.Threshold(MorphImg, MorphImg, 0.99, 255, ThresholdTypes.Binary);  //上圖像素值在0~1之間
            kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(7, 3), new OpenCvSharp.Point(-1, -1));
            Cv2.MorphologyEx(MorphImg, MorphImg, MorphTypes.Open, kernel);  //開操作
            //Cv2.ImShow("t-distance", MorphImg);
 
            //找到種子的輪廓區(qū)域
            OpenCvSharp.Point[][] contours;
            HierarchyIndex[] hierarchly;
            Cv2.FindContours(MorphImg, out contours, out hierarchly, RetrievalModes.External, ContourApproximationModes.ApproxSimple, new OpenCvSharp.Point(0, 0));
            Mat markers = Mat.Zeros(image.Size(), MatType.CV_8UC3);
            int x, y, w, h;
            Rect rect;
            for (int i = 0; i < contours.Length; i++)
            {
                // Cv2.DrawContours(markers, contours, i, Scalar.RandomColor(), 2, LineTypes.Link8, hierarchly);
                rect = Cv2.BoundingRect(contours[i]);
                x = rect.X;
                y = rect.Y;
                w = rect.Width;
                h = rect.Height;
                Cv2.Circle(result_image, x + w / 2, y + h / 2, 20, new Scalar(0, 0, 255), -1);
                if (i >= 9)
                {
                    Cv2.PutText(result_image, (i + 1).ToString(), new OpenCvSharp.Point(x + w / 2 - 18, y + h / 2 + 8), HersheyFonts.HersheySimplex, 0.8, new Scalar(0, 255, 0), 2);
                }
                else
                {
                    Cv2.PutText(result_image, (i + 1).ToString(), new OpenCvSharp.Point(x + w / 2 - 8, y + h / 2 + 8), HersheyFonts.HersheySimplex, 0.8, new Scalar(0, 255, 0), 2);
                }
            }
 
            textBox1.Text = "number of corns: " + contours.Length;
            pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
 
 
        }
 
        private void pictureBox2_DoubleClick(object sender, EventArgs e)
        {
            Common.ShowNormalImg(pictureBox2.Image);
        }
 
        private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            Common.ShowNormalImg(pictureBox1.Image);
        }
    }
}

到此這篇關(guān)于C#利用OpenCvSharp實現(xiàn)玉米粒計數(shù)的文章就介紹到這了,更多相關(guān)C# OpenCvSharp計數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c#重寫TabControl控件實現(xiàn)關(guān)閉按鈕的方法

    c#重寫TabControl控件實現(xiàn)關(guān)閉按鈕的方法

    這是關(guān)于c#重寫TabControl控件實現(xiàn)關(guān)閉按鈕的例子,整理了一下,與大家分享。
    2013-04-04
  • C#中Ilist與list的區(qū)別小結(jié)

    C#中Ilist與list的區(qū)別小結(jié)

    本篇文章主要是對C#中Ilist與list的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#調(diào)用OpenCV開發(fā)簡易版美圖工具【推薦】

    C#調(diào)用OpenCV開發(fā)簡易版美圖工具【推薦】

    本文主要介紹在WPF項目中使用OpenCVSharp3-AnyCPU開源類庫處理圖片,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-10-10
  • C#各種異常處理方式總結(jié)

    C#各種異常處理方式總結(jié)

    這篇文章介紹了C#各種異常的處理方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • unity實現(xiàn)場景跳轉(zhuǎn)

    unity實現(xiàn)場景跳轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了unity實現(xiàn)場景跳轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C#和Java中二維數(shù)組區(qū)別分析

    C#和Java中二維數(shù)組區(qū)別分析

    這篇文章主要介紹了C#和Java中二維數(shù)組區(qū)別分析,主要講述了二維數(shù)組在C#和Java中定義及應(yīng)用的區(qū)別,非常實用,需要的朋友可以參考下
    2014-10-10
  • C# HTTP認(rèn)證方式詳解與代碼實現(xiàn)

    C# HTTP認(rèn)證方式詳解與代碼實現(xiàn)

    在C#中,HTTP認(rèn)證是客戶端與服務(wù)器之間進(jìn)行身份驗證的一種機(jī)制,常見的HTTP認(rèn)證方式包括:Basic認(rèn)證、Digest認(rèn)證、OAuth、Bearer Token等,下面我們將從工作原理、優(yōu)缺點對比、代碼實現(xiàn)、案例實戰(zhàn)四個方面詳細(xì)介紹這些認(rèn)證方式,需要的朋友可以參考下
    2025-03-03
  • C#比較日期的方法總結(jié)

    C#比較日期的方法總結(jié)

    在本篇內(nèi)容中小編給大家整理了關(guān)于C#比較日期的方法和相關(guān)知識點,有需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • 詳解WPF如何動態(tài)生成DataGrid的行和列

    詳解WPF如何動態(tài)生成DataGrid的行和列

    在日常開發(fā)中,DataGrid作為二維表格,非常適合數(shù)據(jù)的展示和統(tǒng)計,本文以一些簡單的小例子,簡述在WPF開發(fā)中,如何動態(tài)生成DataGrid的行和列,需要的可以了解下
    2024-02-02
  • c#執(zhí)行外部命令示例分享

    c#執(zhí)行外部命令示例分享

    c#執(zhí)行外部命令示例分享,大家參考使用吧
    2013-12-12

最新評論