【Emgu CV教程】10.15、FillPoly()不規則形狀填充顏色

文章目錄

  • 一、概念
  • 二、填充不規則圖形
    • 1.原始素材
    • 2.代碼
    • 3.運行結果
  • 二、最大輪廓填充顏色
    • 1.原始素材
    • 2.代碼
    • 3.運行結果


一、概念

圖像的連通域是指圖像中具有相同像素值并且位置相鄰的像素組成的區域,連通域分析是指在圖像中尋找出彼此互相獨立的連通域并將其標記出來。

上一篇講的是利用ConnectedComponentsWithStats查找連通區域,如果我們已經得到了一個由n個點組成的輪廓,想把這個區域填充成某個顏色,怎么辦呢,Emgu CV中有這樣一個函數:

public static FillPoly
(IInputOutputArray img, // 輸入輸出圖像IInputArray points, // 點的集合,或者是輪廓MCvScalar color, // 要填充的顏色LineType lineType = LineType.EightConnected, // 線形int shift = 0, // 不知道,一般用不上Point offset = default(Point) // 不知道,一般用不上
)

此函數輸入圖像和輸出圖像使用一個變量傳入,然后只需要再設定points和color兩個參數就行。

二、填充不規則圖形

1.原始素材

原始素材srcMat如下圖:
在這里插入圖片描述
圖像寬737,長349。

2.代碼

下面代碼實現隨機的五邊形,填充到原始圖像中:

Mat dstMat = srcMat.Clone();VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
VectorOfPoint vPoints1 = new VectorOfPoint();
System.Drawing.Point[] pt = new System.Drawing.Point[1];
int width = dstMat.Width;
int height = dstMat.Height;
Random random = new Random();
for (int i = 0; i < 5; i++)
{pt[0].X = Convert.ToInt32(random.Next(0, width));pt[0].Y = Convert.ToInt32(random.Next(0, height));vPoints1.Push(pt);
}contours.Push(vPoints1);
CvInvoke.FillPoly(dstMat, contours, new MCvScalar(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)));
CvInvoke.Imshow("Final result image, " + dstMat.Size.ToString(), dstMat);

3.運行結果

上面的代碼很簡單,直接上運行結果:
在這里插入圖片描述

二、最大輪廓填充顏色

1.原始素材

原始素材srcMat如下圖:
在這里插入圖片描述

圖像寬979,長755。

2.代碼

Mat tempMat = srcMat.Clone();
Mat dstMat = srcMat.Clone();
Mat gray = new Mat();
int threshold = Convert.ToInt16(TextBoxThreshold.Text.Trim().ToString());// 轉成灰度圖再二值化
CvInvoke.CvtColor(tempMat, gray, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(gray, gray, threshold, 255, ThresholdType.Binary);
CvInvoke.Imshow("Gray and threshold", gray);// 定義輪廓集合
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
VectorOfRect hierarchy = new VectorOfRect();// 根據下拉框選擇輪廓檢索模式,查找輪廓并繪制
switch (ComboBoxType.Text)
{case "External":CvInvoke.FindContours(gray, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxNone);break;case "List":CvInvoke.FindContours(gray, contours, hierarchy, RetrType.List, ChainApproxMethod.ChainApproxNone);break;case "Ccomp":CvInvoke.FindContours(gray, contours, hierarchy, RetrType.Ccomp, ChainApproxMethod.ChainApproxNone);break;case "Tree":CvInvoke.FindContours(gray, contours, hierarchy, RetrType.Tree, ChainApproxMethod.ChainApproxNone);break;default:CvInvoke.FindContours(gray, contours, hierarchy, RetrType.Tree, ChainApproxMethod.ChainApproxNone);break;
}// 在一張黑色圖中畫出所有輪廓
Mat allContours = new Mat(new System.Drawing.Size(gray.Cols, gray.Rows), DepthType.Cv8U, 1);
allContours.SetTo(new MCvScalar(0, 0, 0));
CvInvoke.DrawContours(allContours, contours, -1, new MCvScalar(255, 255, 255), 1);// 按照面積篩選,太小的輪廓不計算
Dictionary<int, double> dict = new Dictionary<int, double>();
if (contours.Size > 0)
{for (int i = 0; i < contours.Size; i++){double girth = CvInvoke.ArcLength(contours[i], true);if (girth > 10 && girth < 3000000){dict.Add(i, girth);}}
}var item = dict.OrderByDescending(v => v.Value); // v.Value就代表周長,是降序排列// 給最大輪廓繪制顏色
Random random = new Random();
foreach (var it in item)
{int key = it.Key;CvInvoke.FillPoly(dstMat, contours[key], new MCvScalar(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)));break;
}CvInvoke.Imshow("All contours, " + dict.Count(), allContours);
CvInvoke.Imshow("Final result image, " + dstMat.Size.ToString(), dstMat);

3.運行結果

二值化閾值選擇40,輪廓檢索模式選擇External,運行結果:
![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/f0466f69a9574797af1b75bb7f352ad0.png
二值化圖形中,輪廓周長最大的,就是下面的那個球,所以整體都被填充成新的顏色了。


原創不易,請勿抄襲。共同進步,相互學習。

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

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

相關文章

【最新鴻蒙應用開發】——Want信息載體

信息傳遞載體Want 1、概述 上一章節我們學習了UIAbility組件 【最新鴻蒙應用開發】——一篇搞懂什么是UIAbility-CSDN博客 &#xff0c;其中組件間的交互傳遞信息的媒介就是Want&#xff0c;本章節我們來更加深入學習Want的相關知識。 Want是一種對象&#xff0c;用于在應用組…

2. JavaScript 語法和數據類型

1. 基礎 JavaScript不區分大小寫 2. 注釋 // 單行注釋/* 這是一個更長的&#xff0c;多行注釋 *//* 然而&#xff0c;你不能&#xff0c;/* 嵌套注釋 */ 語法錯誤 */3. 聲明 var 聲明一個變量&#xff0c;可選初始化一個值。 let 聲明一個塊作用域的局部變量&#xff0c;可…

ORM(對象關系映射)概念詳解

一、技術難點 ORM&#xff0c;即對象關系映射&#xff08;Object-Relational Mapping&#xff09;&#xff0c;它的技術難點主要體現在如何將面向對象編程中的類和對象高效地映射到關系型數據庫中的表和記錄。具體來說&#xff0c;有以下幾個方面的技術挑戰&#xff1a; 數據類…

計算機畢業設計項目、管理系統、可視化大屏、大數據分析、協同過濾、推薦系統、SSM、SpringBoot、Spring、Mybatis、小程序項目編號1-500

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

桌面型激光雕刻機的發展前景及TMC應用優勢

一、行業現狀 近兩年來&#xff0c;激光雕刻行業正處于快速發展階段。隨著人們生活水平的提高&#xff0c;對個性化、定制化產品的需求日益增加&#xff0c;激光雕刻以其獨特的創意和精美的效果&#xff0c;滿足了消費者對個性化產品的追求。同時&#xff0c;隨著科技的不斷進…

OCP 安裝 OceanBase集群(企業版3.2.4.1)

創建集群 登錄OCP界面 1.點擊左側工具欄中的集群 2.進入集群頁面后 點擊 右上角的創建集群 集群設置 進入 創建集群 頁面&#xff0c;進行 目標集群 配置 集群種類 根據 生產環境 選擇 分布式 或者 單機集中式&#xff0c;第一次安裝 集群類型 選擇 主集群。 注意&#xf…

計算機網絡到底是指什么?

計算機網絡是信息技術領域中最為核心和復雜的一部分&#xff0c;它涵蓋了眾多的技術原理和應用。下面&#xff0c;我們將從技術層面深入探討計算機網絡的相關內容。 一、計算機網絡的分層模型 計算機網絡的分層模型是網絡通信的基石&#xff0c;它將網絡通信過程劃分為不同的層…

怎么解決企業生產計劃排程的幾大難點?

生產計劃排程&#xff0c;作為企業管理中的核心環節&#xff0c;其復雜性和動態性一直困擾著眾多企業。然而&#xff0c;通過科學的策略和技術手段&#xff0c;這些難點并非不可攻克。 生產環境的動態變化&#xff0c;如臨時訂單改變、緊急插單的需求、產品流程變化等&#xff…

Linux中網絡配置項目筆記

1.NetworkManager安裝 (或者安裝network.service&#xff0c;不要一起裝防止網絡沖突) 有網絡的狀態下yum install 下載無網絡的狀態下使用預先下載rpm包 rpm -ivh systemctl start NetworkManager #啟動 systemctl stop NetworkManager #停止 systemctl restart NetworkMana…

各大AI模型訓練成本大比拼

像OpenAI的ChatGPT、谷歌的Gemini Ultra這樣的高級AI模型&#xff0c;訓練它們通常需要數百萬美元的費用&#xff0c;且該成本還在迅速上升。隨著計算需求的增加&#xff0c;訓練它們所需的計算能力的費用也在飆升。為此&#xff0c;AI公司正在重新考慮如何訓練這些生成式AI系統…

描述Servlet監聽器的類型和用途

Servlet監聽器是Servlet規范中定義的一種特殊的類&#xff0c;用于監聽Web應用程序中特定事件的發生。它們按照監聽的對象和事件類型&#xff0c;可以劃分為多種類型&#xff0c;每種類型都有其特定的用途。 監聽器的類型 按照監聽對象劃分 應用程序環境對象&#xff08;Serv…

華為OD刷題C卷 - 每日刷題 12(數組連續和,求最多可以派出多少支團隊)

1、&#xff08;數組連續和&#xff09;&#xff1a; 這段代碼是解決“數組連續和”的問題。它提供了一個Java類Main&#xff0c;其中包含main方法和getResult方法&#xff0c;用于計算給定數組中有多少個連續區間的和大于等于給定值x。 main方法首先讀取數組的長度n和閾值x&…

【Javascript修煉篇】如何對JSON格式進行轉換

這將是我們幾乎日常都會用到的一個超實用函數。 根據數據的多樣性與結構&#xff0c;API 的響應可能會返回極其復雜的 JSON 對象。有時候&#xff0c;僅僅從整個 JSON 中抓取一個字段可能就不太夠用了。我們可能需要提取多個字段來展示在網頁上。每次手動遍歷這樣的復雜 JSON …

兩站圖片滑動對比效果實現(VUE3)

像這種圖片滑動對比的效果&#xff0c;網上還不少見吧&#xff0c;但是網上卻不好找到完整現成的實現代碼&#xff0c;我找到幾個地方有類似的代碼&#xff0c;但是都不好直接移植到代碼里&#xff0c;因為很多都是使用原生htmlcssjs實現&#xff0c;太復雜了。反而不好應用到v…

Qt for Android 之 OpenCV編譯(Windows下編譯)

簡介 前兩天剛好更新了4.10, 這里以4.10作為示例進行編譯&#xff0c; Qt版本是Qt6.6.2。 準備OpenCV的Android庫 一. 使用官方編譯好的庫 1. 下載OpenCV android SDK opencv-4.10.0-android-sdk.zip 2. 解壓縮 官方提供的包含了多個架構的opencv android庫 二. 自行編譯…

十三、【源碼】ResultMap解析

源碼地址&#xff1a;https://github.com/mybatis/mybatis-3/ 倉庫地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/13-resultMap ResultMap解析 分為兩部分&#xff1a;解析和使用 1.解析 解析XML的時候單獨解析所有的resultMap標簽&#xff0c;封裝成Re…

MySQL 核心模塊揭秘 | 19 期 | 鎖模塊里有什么?什么樣?

InnoDB 中管理表鎖和行鎖的鎖模塊&#xff0c;也就是傳說中的鎖子系統&#xff0c;在內存里是什么樣的&#xff1f; 作者&#xff1a;操盛春&#xff0c;愛可生技術專家&#xff0c;公眾號『一樹一溪』作者&#xff0c;專注于研究 MySQL 和 OceanBase 源碼。 愛可生開源社區出品…

LabVIEW開發EOL功能測試系統

LabVIEW開發EOL功能測試系統 介紹了一種基于LabVIEW開發的EOL功能測試系統方案&#xff0c;涵蓋軟件架構、工作流程、模塊化設計、低耦合性、易于修改與維護、穩定性及硬件選型。系統通過高效的CAN通信實現對電機控制器的全面測試&#xff0c;確保運行可靠并支持未來的升級需求…

危機公關之負面信息優化技巧解析

當今時代&#xff0c;網絡發布信息沒有任何門檻&#xff0c;任何人可以通過互聯網發布信息&#xff0c;這使負面信息產生的可能性大大提高&#xff0c;企業形成危機的可能性也大大提高。針對網絡上的負面信息處理得當可能并不會對品牌造成傷害&#xff0c;處理不當就很可能給企…

QT之可拖動布局研究

1. 背景 最開始只用到了最基本的水平布局 、垂直布局。它的好處就是窗口整體縮放后&#xff0c;控件也自動等比例縮放。 但是比如水平布局之中的控件寬度比例、垂直布局之中的控件高度比例都是固定的。 平時也不怎么開發界面&#xff0c;最近有個需求&#xff0c;想界面上的…