主頁 >  其他 > openCV從入門到放棄

openCV從入門到放棄

2020-09-11 09:32:29 其他

與影像處理之間的關系,opencv的簡介和使用定位

如題...因為偶然的機會需要用到影像處理,像我這么愛學習 并且動手能力又強的人怎么能沒有心得筆記呢,哇哈哈哈,非要說的low逼點這玩意兒這玩意兒就是像素處理,找出像素中的特征規律 然后根據這些規律去處理資料,就是影像特征處理 不是什么鳥人工智能 不是什么鳥人工智能 不是什么鳥人工只能 重要的話說3遍,但是普遍的商業公司對外宣稱卻都是吹噓的啥人工智能高大上的 ,因為像素資料可以理解為信號量,所以是有一些數學理論或者公式能讓他更好的作業的理論基礎的,基于這里面的理論深度要說的話某些演算法也可以達到很高深,所以稱之為智能也不為過,數學不好也不要太害怕,實在很半吊子  那也沒法 將就著搞吧 ,比如我 哇哈哈哈哈,  

一些基本的知識

影像的像素資料可以理解為信號量,影像像素之間的坐標關系稱之為空域 ,主要手段和理念是圖形學 形態學,常見進行物件分割和特征查找的手段有 輪廓查找 霍夫圓 聯通區域標定 腐蝕 膨脹 等 都是空域演算法,其作用本意都是讓空域有意義 進行物件分割 形成有意義的資料,
關于濾波:
去噪點 ,其實就是模糊化 讓毛刺高波跟周圍像素平均 也叫均值濾波 低通濾波,銳化,其實就是讓毛刺像素加上跟周圍的方差 這樣大的被放大 也叫高通濾波 ,可以讓邊緣更明顯,顏色空間的處理 ,簡易理解可理解為直方圖處理 ,可理解為上面一樣,理論化的說 跟書上說的一樣也就是波處理,讓某一部分波不可見 而把另一部分拉伸到0~255的范圍 讓特征部分對比更明顯 不至于浪費輸出帶寬,典型的對比度調整 對比度均勻化 本質都是波處理 ,閾值化 典型的削波處理 ,波處理都是會損失資訊的 尤其是閾值化 ,但是我們這樣做的目的是 讓計算機更容易判別 比如輪廓識別,   一些簡易而有效的思路也可以使用并不是多高深的數學公式演算法 ,比如有干擾線的驗證碼識別 怎么進行分割 其實可以用 直方圖投影,最低值那一部分 也就是最細的那一部分 肯定就是干擾線 ,則可進行分割,    很久以前偶爾看到一直不明白搞那些花里胡哨的的不同色調的玩意兒影像效果到底有神馬作用 好看嗎,多年后的我好像稍微明白那么一丁點兒了,那些不是給你看的而是給計算機看的,   好吧我也不知道我唧唧歪歪說的些啥 ,就當我 就當你們都懂了吧 哇哈哈哈哈,好了咸淡扯完了,接下來opencv使用,其實就直接看那些opencv入門類的書其實就成 但是這玩意兒是C++寫的 默認也是c++系結 ,網上代碼見得最多就是 python系結的代碼,但是我是懂C++的  ,這不就派上用場了 找了C++的opencv入門教程  結合c++教程里opencv的概念理論 然后找了點python系結的參考代碼 改吧改吧 一周多時間 就搞會了 ,我感覺我膨脹了   哇哈哈哈哈,  

openCV基本使用

 載入一幅影像,基本理念是像素資料都存盤在Mat里面 ,對矩陣進行顏色變換 相當于就是整體顏色更換了一種處理方式,
 1 Mat src = https://www.cnblogs.com/assassinx/p/Cv2.ImRead("lena.jpg");//new Mat("lena.jpg", ImreadModes.Color);
 2 //對顏色矩陣進行變換
 3 //Mat src2= src.CvtColor(ColorConversionCodes.RGB2GRAY);
 4 //輸出變換后的矩陣資料 發現就變成灰度的了
 5 //Cv2.ImShow("src", src2);
 6 
 7 //畫一條線段
 8 //這里要求的引數是inputArray  ,其實可以簡單的當做Mat型別即可  P67
 9 Cv2.Line(src, 0, 0, 20, 20, new Scalar(0, 255, 0));
10 Cv2.ImShow("src", src);

opencv里面有幾種基本的資料型別比如Point Path這些 ,細想一下就能夠想得到 ,影像處理 倒騰的是什么 特征 特征 特征 ,這些東西就是來進行資料互動用的,有可能是用作輸入 比如你要標注一個ROI區域 ,也有可能是用作opencv輸出用的 比如opencv從圖中檢測出來一個幾何圖形 給你的反饋,好接下來我們演示一下簡單的標注 影像疊加混合 轉存,

 1 Mat image = new Mat("lena.jpg");
 2 Mat logo = new Mat("car.jpg");
 3 //定義一個mat型別 用于存放影像的ROI
 4 //方法1
 5 //好像在某篇帖子上是說過 ROI感興趣區域是用mat定義的,然后縮放還是裁剪的時候是會以此為參照
 6 
 7 //把lena圖的感興趣區域設定為小圖大小?
 8 //基本理念
 9 //實質上是通過image 結合Rect建立了一個選區 ,其實操作還是操作的原來的像素,
10 //對原圖的影響始終超不出此區域(注意imgROI并不是一塊獨立的資料區域)
11 Mat imageROI = new Mat(image, new Rect(100, 100, logo.Cols, logo.Height));
12 
13 //把小圖疊加到原圖的感興趣區域?
14 //注意 操作后 imageROI的影像是小圖大小  通過透明混合了兩幅圖(原圖和 imageROI都操作了)
15 Cv2.AddWeighted(imageROI, 1, logo, 0.3, 0, imageROI);//此方法必須兩個圖寬高一致
16 
17 //這是網上的代碼 c++的構造器代碼套路方式 ,通過一個物件作為引數創建一個物件
18 //       Mat src = https://www.cnblogs.com/assassinx/p/imread("test.jpg");
19 //            Mat logo = imread("logo.jpg");            
20 ////設定ROI區域
21 //Mat ROI = src(Rect(20, 25, logo.cols, logo.rows));//注意這邊Rect函式,先列后行(長*高(寬))
22 
23 //注意
24 imageROI.Line(0, 0, 460, 425, new Scalar(0, 0, 255));
25 
26 //int[] compression_params = new int[2];
27 //compression_params[0] = (int)OpenCvSharp.ImwriteFlags.PngCompression;
28 //compression_params[1] = 9;
29 //imageROI.ImWrite("ROI混合區域.png", compression_params);
30 //image.ImWrite("疊加.png", compression_params);
31 
32 Cv2.ImShow("疊加", image);
 1 Mat srcImage1 = new Mat("car.jpg");
 2 Mat srcImage2 = new Mat("ship.jpg");
 3 float g_dalphaValue = https://www.cnblogs.com/assassinx/p/(float)trackBar1.Value/(float)trackBar1.Maximum;
 4 float g_dBetaValue = https://www.cnblogs.com/assassinx/p/1.0f - g_dalphaValue;//1.0f;//
 5 //根據alpha 和beta進行線性混合
 6 Mat dstImage = new Mat();
 7 Cv2.AddWeighted(srcImage1, g_dalphaValue, srcImage2, g_dBetaValue, 0.0, dstImage);
 8 
 9 Bitmap dstBmp = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(dstImage);
10 pictureBox1.Image = dstBmp;

效果:

 

 ROI也就是感興趣區域,只要標定過后然后整個操作都只影響這個區域范圍(注意圖中畫的紅色線段是從小圖ROI區域開始的),整個程序中進行物件分割然后分塊處理降低整體影像對演算法的效果影響 ,這也是影像處理里面的常規套路,

太無聊了,來點稍微有丁點意思的

 來點稍微有丁點意思的,是的讓你體會到人類智慧以及計算機的神奇之處哇哈哈哈哈,注意這里的有意思之處是來源于opencv底層的幾何檢測函式功能 說白了我們只是個搬磚的 如果你更有脾氣一點 你應該把檢測的原理搞懂,好 我們要做的是檢測影像中的所有幾何圖形 有哪些是一類的 我們把它標注出來,用到了上面講的opencv基本套路和概念,

 1 public void ShapeMatchTest()
 2 {
 3     Mat src = https://www.cnblogs.com/assassinx/p/Cv2.ImRead("shape4.png");
 4     Mat src2 = src.CvtColor(ColorConversionCodes.RGB2GRAY);
 5     Mat src3 = src2.Threshold(250, 255, ThresholdTypes.BinaryInv);//THRESH_BINARY_INV
 6 
 7     Mat[] findeds;
 8 
 9     //用于存盤輪廓的?
10     OpenCvSharp.Point[][] contours;
11     HierarchyIndex[] hierarchy;// Vec4i[]錯誤    9    引數 2: 無法從“out OpenCvSharp.Vec4i[]”轉換為“out OpenCvSharp.Hier  
12 
13     // Mat[] contours2;
14     //Mat hierarchy2 = new Mat();
15 
16     //找出并顯示了所有輪廓  ,注意并不是一個完整的路徑 標識一個輪廓 而是二維陣列
17     src3.FindContours(out contours, out hierarchy, RetrievalModes.CComp, ContourApproximationModes.ApproxSimple);
18     //src3.FindContours(out contours2,  hierarchy2, RetrievalModes.CComp, ContourApproximationModes.ApproxSimple);
19 
20     //for (int i = 0; i < contours2.Length; i++)
21     //{
22     //    src.DrawContours(contours2[i], contours2,i, new Scalar(0, 255, 0), 3);
23     //}
24     Bitmap resultImg = MatCopyToBmp(src);
25 
26 
27     //顯示輪廓點 事實證明 每個contours[i] 是一個路徑 ,并且每個路徑里面的點是順序排列的 
28     System.Drawing.Graphics g = Graphics.FromImage(resultImg);
29     //DrawBmpContours(g, contours);
30     //    ret = cv2.matchShapes(k0,c0,1,0.0)
31     //        cv2.drawContours(img,[c0],-1,(0,255,0),2)
32 
33     //對所有相近輪廓進行歸類 雙重list
34     List<List< OpenCvSharp.Point[]>> matched = new List<List<OpenCvSharp.Point[]>>();
35     OpenCvSharp.Point[][] contours2 = (OpenCvSharp.Point[][])contours.Clone();
36 
37     //首先把第一個輪廓歸為一組
38     matched.Add(new List<OpenCvSharp.Point[]>() { contours[0]});
39 
40 
41     for (int i = 1; i < contours.Length; i++)//直接從第二個開始
42     {
43         //假定沒匹配到
44         bool matchedok=false;
45         //在已經歸好類的組里面找
46         for (int j = 0; j < matched.Count; j++)
47         {
48             //當前跟歸好類的匹配 因為一類的都是一樣的所以只匹配第一個
49             var ret = Cv2.MatchShapes(contours[i], matched[j][0], ShapeMatchModes.I1, 0.0);
50             Console.WriteLine(ret);
51             //<0.05基本上可以準確區分
52             //shape.png <1可區分正方形三角形
53             //數值越大區分能力越弱
54             //0.2基本可區分銳角三角形 鈍角三角形 (正方形 包括旋轉了的) ,區分能力已經較弱
55             if (ret <0.1)
56             {
57                 //如果匹配上則往那一類里面歸
58                 matchedok=true;
59                 matched[j].Add(contours[i]);
60                 break;
61             }
62         }
63         //如果當前的跟以前的所有的都沒匹配上則另啟一組
64         if(matchedok==false){
65             matched.Add(new List<OpenCvSharp.Point[]>() { contours[i]});
66         }
67     }
68     //只繪制相似的圖形
69     //OpenCvSharp.Point[][] contoursMatched = new OpenCvSharp.Point[matched.Count][];
70     //for (int i = 0; i < contoursMatched.Length; i++)
71     //{
72     //    src.DrawContours(contoursMatched, i, new Scalar(0, 255, 0), 3);
73     //}
74 
75     Scalar[] scars = new Scalar[]{
76         new Scalar(255,0,0),
77     new Scalar(0,255,0),
78     new Scalar(0,0,255),
79     new Scalar(255,255,0), 
80     new Scalar(255,0,255),new Scalar(0,255,255),
81     new Scalar(0,0,0)};
82 
83     Console.WriteLine(matched.Count + "");
84     int scrindx=0;
85     for (int i = 0; i < matched.Count; i++)
86     {
87         Random rdm = new Random();
88         Scalar cor = scars[(++scrindx)%7];//new Scalar(rdm.Next(1, 255), rdm.Next(1, 255), rdm.Next(1, 255));
89         for (int j = 0; j < matched[i].Count; j++)
90         {
91             src.DrawContours(matched[i], j, cor, 3);
92         }
93     }
94 
95     //繪制結果到表單
96     Graphics gForm = Graphics.FromHwnd(this.Handle);
97     gForm.DrawImage(resultImg, new PointF(0, 0));
98     Cv2.ImShow("hahaha", src);
99 }

效果圖:

經過一段時間的學習呢,最后我的作業也完成了,由于特征比較明顯演算法本身難度不是想象的那么大 opencv呢太重了,所以最終沒有用到任何第三方的庫,提前祝大家端午節愉快,,,

 

總結

 以前我用GDI+的SetPixel()處理像素不是被人罵嗎,實際上opencv這玩意兒要說的話照我的就是可以理解為一個 進行像素處理 的 “效率工具” 并且我試過了寫的也確實很牛逼 演算法的效率很高,并且自帶有一些影像處理的慣用套路 和演算法在里面 演算法的引數調節 資料展現都是蠻方便的 特別是mat矩陣資料跟API無縫結合的設計,然后能搞懂一些數學知識是最好,最不濟也必須學習一些影像處理的基本概念,有些演算法可以不用完全搞懂原理 但是得搞懂大概的程序 否則調引數你不知道怎么調對最終結果會產生什么影響,然后自己模擬一個程序 通過opencv的多個函式相結合就能達到想要的效果比如低通濾波然后腐蝕在某些圖就能夠達到物件分割,總之opencv理解為自動化影像處理的 “效率工具”

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/5190.html

標籤:其他

上一篇:three.js中的矩陣變換(模型視圖投影變換)

下一篇:opengl簡單入門實體

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more