C#圓形卡尺測量程序基于halcon

廢話不多說上源碼

覺得帖子有用給點個贊哈在這里插入圖片描述

先來個效果圖
在這里插入圖片描述

下邊的是源碼,自己新建一個文件粘貼進去,包含到您現在的項目 中。這串源碼后邊是使用方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HalconDotNet;public class CircleMeasure{/// <summary>/// 檢測形態信息/// </summary>public Metrology_INFO m_MetrologyInfo;//圓形測量參數對象public Circle_INFO m_CircleInfo;//圓形測量基準圓形參數對象public Circle_INFO m_OutCircleInfo;//圓形測量完成參數對象#region 卡尺圓形測量參數信息/// <summary>/// 圓信息/// </summary>public struct Circle_INFO{public double Row_center, Column_center, Radius, StartPhi, EndPhi;public string PointOrder;}/// <summary>/// 測量信息/// </summary>public struct Metrology_INFO{public double Length1, Length2, Threshold, MeasureDis;public HTuple ParamName, ParamValue;public int PointsOrder;}#endregion/// <圓形測量參數對象>/// /// </summary>/// <param name="_length1"></長/2>/// <param name="_length2"></寬/2>/// <param name="_threshold"></閾值>/// <param name="_measureDis"></間隔>/// <param name="_paraName"></參數名>/// <param name="_paraValue"></參數值>/// <param name="_pointsOrder"></點順序>public void MetrologyINFOSet(double _length1, double _length2, double _threshold, double _measureDis, HTuple _paraName, HTuple _paraValue, int _pointsOrder){m_MetrologyInfo.Length1 = _length1;                        // 長/2m_MetrologyInfo.Length2 = _length2;                        // 寬/2m_MetrologyInfo.Threshold = _threshold;                    // 閾值m_MetrologyInfo.MeasureDis = _measureDis;                  //間隔m_MetrologyInfo.ParamName = _paraName;                     //參數名m_MetrologyInfo.ParamValue = _paraValue;                   //參數值m_MetrologyInfo.PointsOrder = _pointsOrder;                //點順序 0位默認,1 順時針,2 逆時針}/// <圓形測量基準圓形參數對象參數設置>/// /// </summary>/// <中心Y坐標="m_Row_center"></中心Y坐標>/// <中心X坐標="m_Column_center"></中心X坐標>/// <半徑="m_Radius"></半徑>/// <param name="m_StartPhi"></開始角度>/// <param name="m_EndPhi"></結束角度>/// <param name="m_PointOrder"></點順序>public void CircleINFOSet(double m_Row_center, double m_Column_center, double m_Radius, double m_StartPhi, double m_EndPhi, string m_PointOrder){m_CircleInfo.Row_center = m_Row_center;m_CircleInfo.Column_center = m_Column_center;m_CircleInfo.Radius = m_Radius;m_CircleInfo.StartPhi = m_StartPhi;m_CircleInfo.EndPhi = m_EndPhi;m_CircleInfo.PointOrder = m_PointOrder;//點順序 0位默認,1 順時針,2 逆時針}/// <summary>/// 檢測圓/// </summary>/// <param name="inImage">輸入圖像</param>/// <param name="inCircle">輸入圓</param>/// <param name="inMetrology">輸入形態學</param>/// <param name="outCircle">輸出圓</param>/// <param name="outR">輸出行坐標</param>/// <param name="outC">輸出列坐標</param>/// <param name="outMeasureXLD">輸出檢測輪廓</param>public void MeasureCircle(HImage inImage, Circle_INFO inCircle, Metrology_INFO inMetrology, out Circle_INFO outCircle, out HTuple outR, out HTuple outC, out HXLDCont outMeasureXLD){HMetrologyModel hMetrologyModel = new HMetrologyModel();try{outCircle = new Circle_INFO();HTuple CircleResult = new HTuple();HTuple CircleInfo = new HTuple();CircleInfo.Append(new HTuple(new double[] { inCircle.Row_center, inCircle.Column_center, inCircle.Radius }));hMetrologyModel.AddMetrologyObjectGeneric(new HTuple("circle"), CircleInfo, new HTuple(inMetrology.Length1),new HTuple(inMetrology.Length2), new HTuple(1), new HTuple(inMetrology.Threshold), inMetrology.ParamName, inMetrology.ParamValue);hMetrologyModel.ApplyMetrologyModel(inImage);outMeasureXLD = hMetrologyModel.GetMetrologyObjectMeasures("all", "all", out outR, out outC);CircleResult = hMetrologyModel.GetMetrologyObjectResult(new HTuple("all"), new HTuple("all"), new HTuple("result_type"), new HTuple("all_param"));if (CircleResult.TupleLength() >= 3){outCircle.Row_center = CircleResult[0].D;outCircle.Column_center = CircleResult[1].D;outCircle.Radius = CircleResult[2].D;}hMetrologyModel.Dispose();}catch (Exception ex){outCircle = new Circle_INFO();outR = new HTuple();outC = new HTuple();outMeasureXLD = new HXLDCont();hMetrologyModel.Dispose();//異常寫入日志文件// MessageBox.Show(ex.Message);}}/// <summary>/// 根據位置變換圓/// </summary>/// <param name="homMat">變換關系</param>/// <param name="circle">圓</param>public static void AffineCircle(HHomMat2D homMat, ref Circle_INFO circle){double row, col, phi;homMat.AffineTransPixel(circle.Row_center, circle.Column_center, out row, out col);phi = ((HTuple)homMat[0]).TupleAcos().D;circle.Row_center = row;circle.Column_center = col;circle.StartPhi += phi;circle.EndPhi += phi;}}

接下來介紹使用方法

//new個CircleMeasure的對象出來
public CircleMeasure mCircleMeasure = new CircleMeasure();
//卡尺圓形測量數據初始化try
{mCircleMeasure.CircleINFOSet(0, 0, 50, 0, 2 * 3.14, "positive");mCircleMeasure.MetrologyINFOSet(20,20,30,5,"measure_distance",1,0);
}catch { }開始進行測量//定義各個需要的變量HTuple outR = null, outC = null;HTuple hv_Row = null, hv_Column = null, hv_Radius = null;HTuple hv_Row11 = null, hv_Column11 = null, hv_Row12 = null, hv_Column12 = null, hv_Angle1 = null, hv_Angle2 = null;HXLDCont m_MeasureXLD = new HXLDCont();//LeftUpCamImageDisplay是halcon顯示圖像窗口控件名稱LeftUpCamImageDisplay.HalconWindow.SetColor("red");LeftUpCamImageDisplay.HalconWindow.SetDraw("margin");//[DrawCircleMod介紹](https://blog.csdn.net/cashmood/article/details/99756580)HOperatorSet.DrawCircleMod(LeftUpCamImageDisplay.HalconWindow,1296 ,972 ,140 ,out hv_Row, out hv_Column, out hv_Radius);//設置測量參數mCircleMeasure.CircleINFOSet(hv_Row, hv_Column, hv_Radius, hv_Angle1, hv_Angle2, "positive");mCircleMeasure.MetrologyINFOSet(hv_Radius / 5, hv_Radius / 50, 30, 5, new HTuple(("measure_distance")),(new HTuple(10)), 0);mCircleMeasure.MeasureCircle(LeftUpCamCurrentImg, mCircleMeasure.m_CircleInfo, mCircleMeasure.m_MetrologyInfo, out mCircleMeasure.m_OutCircleInfo, out outR, out outC, out m_MeasureXLD);//顯示測量結果LeftUpCamImageDisplay.HalconWindow.DispObj(LeftUpCamCurrentImg);LeftUpCamImageDisplay.HalconWindow.SetColor("blue");LeftUpCamImageDisplay.HalconWindow.SetDraw("margin");m_MeasureXLD.DispObj(LeftUpCamImageDisplay.HalconWindow);LeftUpCamImageDisplay.HalconWindow.SetTposition(50, 10);LeftUpCamImageDisplay.HalconWindow.WriteString("  CenterRow:" + mCircleMeasure.m_OutCircleInfo.Row_center.ToString() + "     CenterCol:" + mCircleMeasure.m_OutCircleInfo.Column_center.ToString() + "   Radius::" + mCircleMeasure.m_OutCircleInfo.Radius.ToString());m_MeasureXLD.Dispose();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254723.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL松散索引掃描與緊湊索引掃描

什么是松散索引&#xff1f; 答&#xff1a;實際上就是當MySQL 完全利用索引掃描來實現GROUP BY 的時候&#xff0c;并不需要掃描所有滿足條件的索引鍵即可完成操作得出結果。 要利用到松散索引掃描實現GROUP BY&#xff0c;需要至少滿足以下幾個條件&#xff1a;◆ GROUP BY 條…

算法馬拉松24

算法馬拉松24 A 小C的多邊形 題意&#xff1a;n1個點的多邊形。給外圈的邊標記上1~n&#xff0c;里圈的邊也標記上1~n&#xff0c;使得對于一個外圈相鄰點與中間點構成的三角形的邊權之和都相等。\(n \le 10^6\) 題解&#xff1a;顯然每個三角形權值和為\(\frac{3(n1)}{2}\) 一…

HUD2795 線段樹(單點更新)

題目中給出的h和w范圍均大&#xff0c;其實n的最大范圍才200000&#xff0c;所以我們建立的線段樹大小為min(h,n),線段樹的每一個節點包含一個變量c&#xff0c;記錄當前區間內還剩下的可以put on的最大長度。插入一個數時&#xff0c;如果該數大于該區間最大值&#xff0c;則返…

科維PLC運行時系統ProConOS embedded CLR 2.2 特定應用

ProConOS embedded CLR是新型的開放式標準化PLC運行時系統&#xff0c;符合IEC 61131標準&#xff0c;可執行不同的自動化任務&#xff08;PLC、PAC、運動控制、CNC、機器人和傳感器&#xff09;。   通過采用國際標準的微軟中間語言&#xff08;依據IEC/ISO 23271標準為MSIL…

linux下vi命令大全

進入vi的命令 vi filename :打開或新建文件&#xff0c;并將光標置于第一行首 vi n filename &#xff1a;打開文件&#xff0c;并將光標置于第n行首 vi filename &#xff1a;打開文件&#xff0c;并將光標置于最后一行首 vi /pattern filename&#xff1a;打開文件&…

set()與get()詳細解答(C#)

這幾天在搬磚時候用到了set()與get()&#xff0c;同事問了我一些問題&#xff0c;我打算在博客中總結一下。 覺得幫助到了您&#xff0c;幫我點個贊哦。 屬性訪問器 其實說白了就是操作一個屬性&#xff0c;更通俗一點說就是對一個變量的取值與賦值。 先來看get() get 訪問…

IM應用中如何計算富文本的高度

背景 在開發IM的項目過程中&#xff0c;經常會有出現一些需要計算DOM高度&#xff0c;然后超出若干行隱藏等需求。很多時候&#xff0c;需要計算高度的DOM元素都是動態生成的&#xff0c;我們無法在數據渲染前獲取到它的高度。 如果沒有任何交互&#xff0c;我們可以通過CSS來實…

G代碼 機器人的CNC實現

&#xfeff;  控制銑削工作臺和工件的NC程序&#xff0c;通過CAD軟件創建&#xff0c;這些NC程序與特定的機器類型相關。 NC程序在笛卡爾坐標系中動作的描述&#xff0c;對于需要確保一個明確的變換軸位置的關節型的機器人來說&#xff0c;缺少附加的狀態和旋轉信息。傳…

IScroll5中文API整理,用法與參考

IScroll是移動頁面上被使用的一款仿系統滾動插件。IScroll5相對于之前的IScroll4改進了許多&#xff0c;使得大家可以更方便的定制所需的功能了。 做項目的時候正好用到了這個插件&#xff0c;自己做了一下總結&#xff0c;發在這里方便大家學習IScroll5。 官網&#xff1a;htt…

Linux?安裝USB攝像頭

sudo apt-get updatesudo apt-get install fswebcamsudo apt-get install mplayersudo apt-get install alsamixer安裝完畢ls /dev查找設備是否有video0這個設備sudo mplayer tv:// 可以看到攝像內容轉載于:https://www.cnblogs.com/smartkeke/p/6820426.html

struct x264_t 維護著CODEC的諸多重要信息

//x264_t結構體維護著CODEC的諸多重要信息struct x264_t{/* encoder parameters ( 編碼器參數 )*/x264_param_t param;x264_t *thread[X264_SLICE_MAX];/* bitstream output ( 字節流輸出 ) */struct{int i_nal;x264_nal_t nal[X264_NAL_MAX];int i_bitstr…

如何判斷一條曲線是否自己相交?

今天看到群里有人在問這個問題&#xff0c;想了一個解決辦法。 我們首先作假設&#xff0c;如果一條曲線有交點&#xff0c;那么它就是相交的對吧。可能大家想的都是這樣&#xff0c;就開始找各種方法去識別交點。 我們換個角度想一下&#xff1a;是不是我們判斷這條曲線是否帶…

XML 與網絡的數據傳輸

&#xfeff;&#xfeff;XML 與網絡的數據傳輸

hdu 5813 Elegant Construction

水題 題意&#xff1a;有n個城市&#xff0c;給你每個城市能到達城市的數量&#xff0c;要你構圖&#xff0c;輸出有向邊&#xff0c;要求無環&#xff0c;輸出任意的解 例&#xff1a; Sample Input 332 1 021 143 1 1 0Sample OutputCase #1: Yes21 22 3Case #2: NoCase #3: …

Redis實戰筆記

Redis 數據庫 一、 概要 1. 特點 用于抽象數據類型的 DSL內存存儲基礎數據結構 API編碼風格避免代碼復雜兩層 API以優化為樂2. 數據類型 鍵值對&#xff08;字符串->字符串&#xff09;哈希列表&#xff08;鏈表&#xff09;集合&#xff1a;差并交有序集合 列表 集合位圖…

內存申請與一級二級指針

1.如果是函數內進行內存申請&#xff0c;很簡單&#xff0c;標準用法就可以了&#xff1a; test(){int *array;array(int *)malloc(sizeof(int)*10);//申請10*4 bytes&#xff0c;即10個單位的int內存單元}注意&#xff0c;malloc使用簡單&#xff0c;但是注意參數和返回值&…

halcon相機標定及圖像矯正(代碼)

侵刪 1 halcon相機標定和圖像矯正 對于相機采集的圖片&#xff0c;會由于相機本身和透鏡的影響產生形變&#xff0c;通常需要對相機進行標定&#xff0c;獲取相機的內參或內外參&#xff0c;然后矯正其畸變。相機畸變主要分為徑向畸變和切向畸變&#xff0c;其中徑向畸變是由透…

找尋一個郵箱

import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;public class zhengze {public static void main(String[] args) { //1.創建一個正則表達式對象Pattern pPattern.compile("[0-9]{6}"); //2.獲得匹配器 String s…

先弄個XML解析器代碼抄一抄 慢慢研究 O(∩_∩)O哈哈~

&#xfeff;&#xfeff;出處&#xff1a;http://bbs.csdn.net/topics/390229172 已經自我放逐好幾年了.打算去上班得了.在最后的自由日子里,做點有意義的事吧... 先來下載地址 http://www.kuaipan.cn/file/id_12470514853353274.htm 已經在很多正式,非正式的場合…

紫書 例題8-10 UVa 714 (二分答案)

這道題讓最大值最小&#xff0c; 顯然是二分答案當題目求的是最大值最小&#xff0c; 最小值最大&#xff0c; 這個時候就要想到二分答案為什么可以二分答案呢&#xff0c; 因為這個時候解是單調性的&#xff0c; 如果簡單粗暴一點就全部枚舉一遍&#xff0c; 驗證答案。但是因…