1. 程式人生 > >輪廓的查詢、表達、繪製、特性及匹配 c#版

輪廓的查詢、表達、繪製、特性及匹配 c#版

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->        //開始匹配
        private void btnStartMatch_Click(object sender, EventArgs e)
        {
            //準備輪廓(這裡只比較最外圍的輪廓)
            Image<Bgr, Byte> image1 = new Image<Bgr, byte>((Bitmap)pbImage1.Image);
            Image<Bgr, Byte> image2 = new Image<Bgr, byte>((Bitmap)pbImage2.Image);
            Image<Gray, Byte> imageGray1 = image1.Convert<Gray, Byte>();
            Image<Gray, Byte> imageGray2 = image2.Convert<Gray, Byte>();
            Image<Gray, Byte> imageThreshold1 = imageGray1.ThresholdBinaryInv(new Gray(128d), new Gray(255d));
            Image<Gray, Byte> imageThreshold2 = imageGray2.ThresholdBinaryInv(new Gray(128d), new Gray(255d));
            Contour<Point> contour1 = imageThreshold1.FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, RETR_TYPE.CV_RETR_EXTERNAL);
            Contour<Point> contour2 = imageThreshold2.FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, RETR_TYPE.CV_RETR_EXTERNAL);
            /*if (contour1.Perimeter / 50 > 2 && contour2.Perimeter / 50 > 2)
            {
                contour1 = contour1.ApproxPoly(contour1.Perimeter / 50, 2, new MemStorage());    //對輪廓進行多邊形逼近(引數設為輪廓周長的1/50)
                contour2 = contour2.ApproxPoly(contour2.Perimeter / 50, 2, new MemStorage());
            }*/
            //進行匹配
            string result = "";
            if (rbHuMoments.Checked)
                result = MatchShapes(contour1, contour2);       //Hu矩匹配
            else if (rbContourTree.Checked)
                result = MatchContourTrees(contour1, contour2); //輪廓樹匹配
            else if (rbPGH.Checked)
                result = MatchPghHist(contour1, contour2);      //成對幾何直方圖匹配
            txtResult.Text += result;
        }

        //Hu矩匹配
        private string MatchShapes(Contour<Point> contour1, Contour<Point> contour2)
        {
            //匹配方法
            CONTOURS_MATCH_TYPE matchType = rbHuI1.Checked ? CONTOURS_MATCH_TYPE.CV_CONTOUR_MATCH_I1 : (rbHuI2.Checked ? CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I2 : CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3);
            Stopwatch sw = new Stopwatch();
            sw.Start();
            //匹配
            double matchValue = contour1.MatchShapes(contour2, matchType);
            sw.Stop();
            double time = sw.Elapsed.TotalMilliseconds;
            return string.Format("Hu矩匹配({0:G}),結果:{1:F05},用時:{2:F05}毫秒\r\n", matchType, matchValue, time);
        }

        //輪廓樹匹配
        private string MatchContourTrees(Contour<Point> contour1, Contour<Point> contour2)
        {
            //生成輪廓樹
            double thresholdOfCreate = double.Parse(txtThresholdOfCreateContourTrees.Text); //生成輪廓樹的閥值
            IntPtr ptrTree1 = CvInvoke.cvCreateContourTree(contour1.Ptr, new MemStorage().Ptr, thresholdOfCreate);
            IntPtr ptrTree2 = CvInvoke.cvCreateContourTree(contour2.Ptr, new MemStorage().Ptr, thresholdOfCreate);
            //匹配
            double thresholdOfMatch = double.Parse(txtThresholdOfMatchContourTrees.Text);   //比較輪廓樹的閥值
            Stopwatch sw = new Stopwatch();
            sw.Start();
            double matchValue = CvInvoke.cvMatchContourTrees(ptrTree1, ptrTree2, MATCH_CONTOUR_TREE_METHOD.CONTOUR_TREES_MATCH_I1, thresholdOfMatch);
            sw.Stop();
            double time = sw.Elapsed.TotalMilliseconds;
            return string.Format("輪廓樹匹配(生成輪廓樹的閥值:{0},比較輪廓樹的閥值:{1}),結果:{2:F05},用時:{3:F05}毫秒\r\n", thresholdOfCreate, thresholdOfMatch, matchValue, time);
        }

        //成對幾何直方圖匹配
        private string MatchPghHist(Contour<Point> contour1, Contour<Point> contour2)
        {
            //生成成對幾何直方圖
            Rectangle rect1 = contour1.BoundingRectangle;
            float maxDist1 = (float)Math.Sqrt(rect1.Width * rect1.Width + rect1.Height * rect1.Height); //輪廓的最大距離:這裡使用輪廓矩形邊界框的對角線長度
            int[] bins1 = new int[] { 60, 20 };
            RangeF[] ranges1 = new RangeF[] { new RangeF(0f, 180f), new RangeF(0f, maxDist1) };     //直方圖第0維為角度,範圍在(0,180),第2維為輪廓兩條邊緣線段的距離
            DenseHistogram hist1 = new DenseHistogram(bins1, ranges1);
            CvInvoke.cvCalcPGH(contour1.Ptr, hist1.Ptr);
            Rectangle rect2 = contour2.BoundingRectangle;
            float maxDist2 = (float)Math.Sqrt(rect2.Width * rect2.Width + rect2.Height * rect2.Height);
            int[] bins2 = new int[] { 60, 20 };
            RangeF[] ranges2 = new RangeF[] { new RangeF(0f, 180f), new RangeF(0f, maxDist2) };
            DenseHistogram hist2 = new DenseHistogram(bins2, ranges2);
            CvInvoke.cvCalcPGH(contour2.Ptr, hist2.Ptr);
            //匹配
            Stopwatch sw = new Stopwatch();
            sw.Start();
            double compareResult;
            HISTOGRAM_COMP_METHOD compareMethod = rbHistCorrel.Checked ? HISTOGRAM_COMP_METHOD.CV_COMP_CORREL : (rbHistChisqr.Checked ? HISTOGRAM_COMP_METHOD.CV_COMP_CHISQR : (rbHistIntersect.Checked ? HISTOGRAM_COMP_METHOD.CV_COMP_INTERSECT : HISTOGRAM_COMP_METHOD.CV_COMP_BHATTACHARYYA));
            if (rbHistEmd.Checked)
            {
                //EMD
                //將直方圖轉換成矩陣
                Matrix<Single> matrix1 = FormProcessHist.ConvertDenseHistogramToMatrix(hist1);
                Matrix<Single> matrix2 = FormProcessHist.ConvertDenseHistogramToMatrix(hist2);
                compareResult = CvInvoke.cvCalcEMD2(matrix1.Ptr, matrix2.Ptr, DIST_TYPE.CV_DIST_L2, null, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                matrix1.Dispose();
                matrix2.Dispose();
            }
            else
            {
                //直方圖對比方式
                hist1.Normalize(1d);
                hist2.Normalize(1d);
                compareResult = CvInvoke.cvCompareHist(hist1.Ptr, hist2.Ptr, compareMethod);
            }
            sw.Stop();
            double time = sw.Elapsed.TotalMilliseconds;
            return string.Format("成對幾何直方圖匹配(匹配方式:{0}),結果:{1:F05},用時:{2:F05}毫秒\r\n", rbHistEmd.Checked ? "EMD" : compareMethod.ToString("G"), compareResult, time);
        }

相關推薦

輪廓查詢表達繪製特性匹配 c#

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> //開始匹配 private void btnSta

JavaCC++C#phppython語言的內在特性應用

當你選擇了網際網路這個行業也就意味著你要終身學習,想必現在的你一定驚歎網際網路的發展速度吧! 網際網路行業不比傳統行業,不是說你精通一門手藝就可以一輩子靠這個手藝來養活自己,網際網路行業沒有這回事,如果你想問有沒有哪一門語言學完之後可以養活自己一輩子,那麼抱歉,我想沒人能回答你。 網際網路發

第五章 繪圖基礎 (GDI裝置環境點線繪製填充)

光柵裝置 raster  device   向量裝置 vector device    對映模式 mapping 轉換 transform 圖元檔案 metafile  區域region  路徑 path 剪裁 clipping  調色盤 palettes 列印 print

SQL server 查詢出現:---“子查詢返回的值不止一個。當子查詢跟隨在 =!=<<=>>= 之後,或子查詢用作表達式時,這種情況是不允許的。”SQL查詢錯誤解析---

gui 允許 select 查詢語句 一對一 行數 style sql 之前 最近用select進行數據篩選,碰到下面的這個錯誤: ---子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之後,或子查詢用作表達式時,這種情況是不

【JAVAEE學習筆記】hibernate02:實體規則對象狀態緩存事務批量查詢和實現客戶列表顯示

使用 ins tro trace ges create 綁定 criteria 命名 一、hibernate中的實體規則 實體類創建的註意事項  1.持久化類提供無參數構造  2.成員變量私有,提供共有get/set方法訪問.需提供屬性  3.持久化類中的屬性,應盡量使用包

mysql查詢今天昨天近7天近30天本月上一月的SQL語句

時間 中比 code mat 信息 where 從大到小 案例 rdate mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句 這篇文章主要介紹了mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句,一般在一些統計報表中比較常用這個時間段,

Day9:yield的表達式形式面向過程編程(grep -rl 'root' /etc)

ear blog break 裝飾 sea end col 位置 append 一.yield的表達式 def foo(): print(‘starting‘) while True: x=yield None#return 2

yield的表達式形式面向過程編程(grep -rl 'root' /etc)

pycha app spa 絕對路徑 文件的 printer earch 判斷 裝飾器 一、yield的表達形式 def foo(): print(‘starting‘) while True: x=yield None#return 2

python基礎之生成器表達式形式面向過程編程內置函數部分

[] remove curd fsp mar send 最大限度 rabl ret 生成器表達式形式 直接上代碼 1 # yield的表達式形式 2 def foo(): 3 print(‘starting‘) 4 while True: 5

可選參數命名參數.NET的特殊類型特性

應用 傳輸 問題 運行 read company ria 隱式類型 dynamic 1、可選參數和命名參數 1.1可選參數 語法: [修飾符] 返回類型 方法名(必選參數n,可選參數n) 註意:

MYSQL查詢今天昨天7天前30天本月數據

form mysq sql _for interval 時間 for days to_days 今天: SELECT * FROM 表名 WHERE TO_DAYS( 時間字段名) = TO_DAYS(NOW()); 昨天: SELECT * FROM 表名 WHERE T

JavaScript學習總結(三函數聲明和表達this閉包和引用arguments對象函數間傳遞參數)

rem [1] incr foo i++ scrip erro ren 推薦 一、函數聲明和表達式 函數聲明: function test() {}; test(); //運行正常 function test() {}; 函數表達式: var test = fun

javascript語句——表達式語句塊語句空語句和聲明語句

產生 nbsp 之間 turn 指南 console 原來 塊級作用域 r++ 前面的話   如果表達式在javascript中是短語,那麽語句(statement)就是javascript整句或命令。表達式計算出一個值,語句用來執行以使某件事發生。javascript程序

SQL語句來查詢今天昨天7天內30天的數據,經典!

diff 指定 first 內容 輸出 har edi time nth ---恢復內容開始--- 今天的所有數據:select * from 表名 where DateDiff(dd,datetime類型字段,getdate())=0 昨天的所有數據:select *

Tingq 模糊查詢 共多少條數據 最大平均求和值 升降序

string sys post nat sender type asp idt acl 頁面代碼 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="

【javascript】正則表達式matchexec和test的使用

p s 下標 mat http [0 使用 regex es2017 false 正則表達式match、exec和test的使用 match和exec在匹配成功時返回的都是數組,在沒有匹配上時返回的都是null;test在匹配成功是返回true,在沒有匹配時返回的是fals

Day4 閉包裝飾器decorator叠代器與生成器面向過程編程三元表達列表解析與生成器表達序列化與反序列化

反序 bsp pic nbsp tor 序列 space 列表解析 列表 http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1362489http://pic.cnhubei.com/space.ph

【書中示例】--《C程序設計語言》第二章:類型運算符表達

類型 tar c程序設計 http 第二章 dtb wix gyp ng2 8azxgp景劫鋼槍勞趴http://tushu.docin.com/sina_636267481113rl5i職旱諛劑興勞http://www.docin.com/krm61755owd5q改坡拖

什麽是事務事務特性事務隔離級別spring事務傳播特性

ons pri table 產生 serializa support enc 不一致 修改 1.什麽是事務: 事務是程序中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性(要麽成功,要麽失敗)。 2.事務特性: 事務特性分為

Mysql數據庫四大特性事物的四個隔離基本MySQL語句獨立表空間

mysql數據庫四大特性、事物的四個隔離、基本mysql語句、獨立表空間Mysql數據庫四大特性、事物的四個隔離、基本MySQL語句、獨立表空間 本人學習mysql的時候感覺筆記有點散所以自己做了一個整合,而且有些概念介紹的太官方了,所以自己根據理解總結了一下。(有不對的請指點!) mysql:sql:關系型