<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          獨(dú)家|OpenCV 1.1 Mat - 基本圖像容器(附鏈接)

          共 4645字,需瀏覽 10分鐘

           ·

          2021-07-30 23:41

          翻譯:陳之炎

          校對:吳振東、林夕


          本文約3600字,建議閱讀10分鐘

          本文為大家系統(tǒng)地介紹了OpenCV官方教程。


          寫在前邊

          讓讀者朋友們較為系統(tǒng)地了解和學(xué)習(xí)OpenCV官方教程,數(shù)據(jù)派THU翻譯組聯(lián)合研究部共同推出OpenCV官方教程翻譯系列。由于所列章節(jié)較多,教程將被分為多篇文章持續(xù)更新發(fā)布。

          原文鏈接:https://docs.opencv.org/4.5.2/de/d7a/tutorial_table_of_content_core.html

          目標(biāo)


          我們可以通過多種方式從現(xiàn)實(shí)世界中獲取數(shù)字圖像,比如:數(shù)碼相機(jī)、掃描儀、計(jì)算機(jī)掃描和磁共振成像等等。在這些情況中,雖然我們?nèi)庋劭吹降氖菆D像,但是當(dāng)需要將圖像在數(shù)字設(shè)備中變換傳輸時(shí),圖像的每個(gè)像素則對應(yīng)一個(gè)數(shù)值。


          例如,上述圖像你可以看到一個(gè)汽車的后視鏡,它可以用包含像素點(diǎn)強(qiáng)度值的矩陣來表示。雖然獲取并存儲像素點(diǎn)強(qiáng)度值的方法各不相同,但是圖像在計(jì)算機(jī)中最終是以數(shù)值矩陣的形式來存儲和處理的。OpenCV是一個(gè)計(jì)算機(jī)視覺庫,主要用于處理和操作圖像像素矩陣信息。因此,你首先需要熟悉OpenCV是如何存儲和處理圖像的。

          Mat


          OpenCV誕生于2001年。當(dāng)時(shí)的庫均是C語言接口創(chuàng)建,圖像以C 語言的數(shù)據(jù)結(jié)構(gòu)IplImage形式存儲。在以往的教程和培訓(xùn)材料中均可以看到這一點(diǎn),而這同時(shí)也反映出了C語言的優(yōu)缺點(diǎn)。最大的挑戰(zhàn)來自于手動(dòng)的內(nèi)存管理,它假設(shè)由用戶來負(fù)責(zé)內(nèi)存的分配和釋放。對于代碼量比較小的程序,手動(dòng)分配內(nèi)存沒有問題。但是當(dāng)代碼量劇增時(shí),處理起來的難度會(huì)急速增大。

          幸運(yùn)的是,C ++引入了類的概念,使得用戶更容易實(shí)現(xiàn)自動(dòng)內(nèi)存管理。同時(shí),C ++與C完全兼容,所以不存在兼容性問題,這也使代碼遷移更加容易。OpenCV 2.0引入了一種新的C++接口,無需考慮內(nèi)存管理問題,使得代碼更加簡潔,即利用更少的代碼量,能夠?qū)崿F(xiàn)更多的功能。C ++接口的主要缺點(diǎn)是:目前許多嵌入式開發(fā)系統(tǒng)只支持C。因此,除非是針對嵌入式平臺,否則沒有必要使用的以往的老方法(除非你是受虐狂程序員,在自找麻煩)。

          在使用Mat 時(shí),需要知道的第一件事情是:無需手動(dòng)分配內(nèi)存。對于不再使用的內(nèi)存,無需進(jìn)行釋放。大多數(shù)OpenCV函數(shù)會(huì)自動(dòng)分配其輸出數(shù)據(jù)。更為便捷的是,如果需要傳遞Mat 對象,則已經(jīng)給它分配好了內(nèi)存空間,可以被重用。換句話說,在任何時(shí)候都只用到執(zhí)行任務(wù)所需要的內(nèi)存,而無需進(jìn)行額外的操作。

          Mat基礎(chǔ)類包含兩部分?jǐn)?shù)據(jù):矩陣頭(包括矩陣大小,存儲方法,矩陣存儲地址等信息)和指向一個(gè)矩陣的指針,這個(gè)矩陣包含了像素值信息(根據(jù)所選定的不同存儲方法而有不同的維度)。矩陣頭大小是一個(gè)常量,不同大小的圖像的矩陣大小各不相同,通常矩陣大小要比圖像大小大幾個(gè)數(shù)量級。

          OpenCV是一個(gè)圖像處理庫,其中包含大量圖像處理函數(shù)。為了解決計(jì)算難題,多數(shù)情況下選用庫中的多個(gè)函數(shù)來實(shí)現(xiàn)計(jì)算功能,常見的做法是將圖像傳遞給函數(shù)。而圖像處理算法的計(jì)算量往往非常大,所以要通過避免不必要的圖像復(fù)制來進(jìn)一步提升程序的運(yùn)行速度。

          為了解決上述問題, OpenCV采用了一種引用計(jì)數(shù)系統(tǒng)。具體做法是,每個(gè)Mat 對象有其各自的頭,兩個(gè)Mat 對象可以通過將矩陣指針指向同一地址來共享一個(gè)矩陣,復(fù)制操作只復(fù)制Mat 頭和指向矩陣的指針,而不是復(fù)制數(shù)據(jù)本身。


          上述所有的對象均指向同一個(gè)數(shù)據(jù)矩陣,對矩陣的任何變動(dòng)均會(huì)影響所有的對象。在實(shí)際示例中,不同的對象只是對同一數(shù)據(jù)的不同的訪問方式,盡管如此,不同MAT 對象的頭各不相同。真正有趣的是,可以創(chuàng)建僅指向部分?jǐn)?shù)據(jù)分段的MAT 對象頭。例如,為了創(chuàng)建一個(gè)圖像的感興趣區(qū)域(ROI),你只需要?jiǎng)?chuàng)建一個(gè)具有行列邊界的新MAT 對象頭:


          那么問題來了 - 如果像素矩陣可以屬于多個(gè)MAT 對象, 那么當(dāng)它不需要再次被使用時(shí),由誰來負(fù)責(zé)清空?答案是:通過引用計(jì)數(shù)機(jī)制(reference counting mechanism)來實(shí)現(xiàn),由最后一個(gè)使用它的對象來清空。每次拷貝MAT 對象頭時(shí),計(jì)數(shù)器便會(huì)加一;當(dāng)對MAT 對象頭進(jìn)行清空時(shí),此計(jì)數(shù)器會(huì)減一。當(dāng)計(jì)數(shù)器的值為零時(shí),矩陣會(huì)被釋放。當(dāng)需要對矩陣自身進(jìn)行復(fù)制時(shí), OpenCV提供cv::Mat::clone() 和cv::Mat::copyTo() 函數(shù)。


          修改F或者G不會(huì)影響A所指向的矩陣,需要記住以下幾點(diǎn):

          • Opencv函數(shù),輸出圖像分配時(shí)是自動(dòng)的(除非另行規(guī)定);

          • 無需考慮OpenCV中C ++接口的內(nèi)存管理;

          • 賦值操作符和拷貝構(gòu)造函數(shù)僅復(fù)制MAT 對象頭;

          • 圖像的基本矩陣可以利用cv::Mat::clone() 和cv::Mat::copyTo()兩個(gè)函數(shù)進(jìn)行復(fù)制。


          存儲方法


          本小節(jié)的內(nèi)容是關(guān)于如何存儲像素值的。你可以選擇色彩空間和使用的數(shù)據(jù)類型。色彩空間是指為給定的顏色編碼的色彩分量組合,最簡單的色彩空間是灰度,它的顏色空間只有黑色和白色,這兩種顏色可以組合出多種灰度。

          為了使圖像色彩更加豐富,色彩空間可以有更多的選擇。每個(gè)色彩空間均可將其分解為三到四個(gè)基本顏色,利用這三到四個(gè)基本顏色的組合來生成其它顏色。主流的色彩空間是RGB,人類的眼睛正是利用RGB構(gòu)建出多種色彩。其基本的顏色是紅色、綠色和藍(lán)色,為了對透明度進(jìn)行編碼,添加了第四個(gè)元素:α(A)。

          除了RGB外,還有多種其它的色彩空間,它們各有優(yōu)勢:

          • RGB是與人眼類似的最為常見的色彩空間,但需要切記的是:OpenCV標(biāo)準(zhǔn)顯示系統(tǒng)使用的色彩空間是BGR(互換了紅色和藍(lán)色通道);

          • HSV和HLS將色彩分解為色調(diào)、飽和度和亮度分量,利用這些分量,可以更加自然地對色彩進(jìn)行描述。例如,去除最后一個(gè)分量之后,算法便對輸入圖像的光照條件不太敏感了;

          • JPEG圖像格式使用的是YCrCb色彩空間;

          •  CIE L * A * B *是一個(gè)感知均勻的色彩空間,可以用它來測量給定的顏色到另一種顏色之間的距離。


          在OpenCV中,每個(gè)組件都有其各自的有效域,即采用何種數(shù)據(jù)類型。組件的存儲方式定義了對其有效域的控制方式。最小的數(shù)據(jù)類型是char,即一個(gè)字節(jié)或8比特位,char可以是無符號的(值從0到255)或帶符號的(值從-127到+127)。在三元組色彩空間(如RGB 色彩空間),可以表示出1600萬種顏色。此外,還可以通過使用float數(shù)據(jù)類型(4字節(jié)= 32比特位)或double數(shù)據(jù)類型(8字節(jié)= 64比特位),對色彩實(shí)現(xiàn)更為精細(xì)的控制和表達(dá)。但是,增加組件數(shù)據(jù)類型長度的同時(shí)也會(huì)增加整個(gè)圖片占用的內(nèi)存大小。

          創(chuàng)建Mat對象


          在調(diào)用、修改和保存圖像教程中,你已經(jīng)學(xué)會(huì)了如何利用cv::imwrite()函數(shù) 將矩陣寫入圖像文件之中。然而,出于調(diào)試的目的,為了更加方便地看到矩陣的實(shí)際值,可以直接使用<<運(yùn)算符。注意,這僅適用于二維矩陣。

          Mat作為一個(gè)圖像容器非常不錯(cuò),但是它也是一個(gè)通用矩陣類。所以,可以是一個(gè)通用矩陣類。為此,它還可以創(chuàng)建和操作多維矩陣。你可以用多種方式來創(chuàng)建Mat對象:


          cv::Mat::Mat 構(gòu)造器


          對于二維和多通道圖像,首先定義出大小:按行和列計(jì)數(shù)。

          然后指定用于存儲元素的數(shù)據(jù)類型和每個(gè)矩陣點(diǎn)的通道數(shù)。按照以下約定,構(gòu)造出多個(gè)定義:


          例如,CV_8UC3是指:使用的是8位長的unsigned char數(shù)據(jù)類型,每個(gè)像素具有三個(gè)通道,可以預(yù)定義多達(dá)四個(gè)通道。cv::Scalar是一個(gè)包含四個(gè)元素的短矢量。可以通過指定cv::Scalar,將所有的矩陣點(diǎn)初始化為自定義的值。如果需要?jiǎng)?chuàng)建更多的圖像矩陣,還可以利用宏來創(chuàng)建,按照下述方式,設(shè)置括號中的通道數(shù)目:

          構(gòu)造C / C ++數(shù)組,并對其進(jìn)行初始化


          上述例子說明了如何創(chuàng)建一個(gè)維數(shù)大于2維的矩陣。首先指定其維數(shù)大小,然后傳遞一個(gè)包含每個(gè)維度大小的指針,其余部分保持不變。


          不能用這種結(jié)構(gòu)初始化矩陣值,如果新的矩陣大小與先前的矩陣大小不一致,會(huì)對矩陣數(shù)據(jù)的存儲重新進(jìn)行分配。

          MATLAB風(fēng)格初始化:cv::Mat::zeros , cv::Mat::ones , cv::Mat::eye 。指定矩陣大小和數(shù)據(jù)類型:



          對于比較小的矩陣,可以使用逗號分隔初始化值或初始化值列表(支持C++ 11):


          為現(xiàn)有的Mat對象創(chuàng)建一個(gè)新的Mat對象頭:cv::Mat::clone or cv::Mat::copyTo。



          可以利用CV :: RANDU()函數(shù),為矩陣寫入隨機(jī)值,此時(shí)需要給定隨機(jī)值的下限和上限:


          輸出格式化


          在上面的例子中,可以看到默認(rèn)的格式設(shè)置選項(xiàng)。OpenCV允許對矩陣輸出進(jìn)行格式化:


          默認(rèn)


          Python 


          逗號分隔值 (CSV)


          NumPy



          C



          其他常見的輸出


          OpenCV中提供了通過<<操作輸出常見的OpenCV數(shù)據(jù)結(jié)構(gòu):


          二維Point


          三維Point


           cv::Mat的std::vector



          std::vector Point



          小型控制臺應(yīng)用程序中均包含了這里的大多數(shù)示例。可以從這里下載或在CPP示例程序中找到它們。你還可以到Y(jié)ouTube網(wǎng)站看相應(yīng)的視頻演示。


          YouTube網(wǎng)站
          https:/www.youtube.com/watch%3fv=1tibU7vGWpk%22

          編輯:王菁
          校對:林亦霖

          下一小節(jié): 1.2 如何掃描圖像、查找表和用OpenCV進(jìn)行時(shí)間測量





          譯者簡介





          陳之炎,北京交通大學(xué)通信與控制工程專業(yè)畢業(yè),獲得工學(xué)碩士學(xué)位,歷任長城計(jì)算機(jī)軟件與系統(tǒng)公司工程師,大唐微電子公司工程師,現(xiàn)任北京吾譯超群科技有限公司技術(shù)支持。目前從事智能化翻譯教學(xué)系統(tǒng)的運(yùn)營和維護(hù),在人工智能深度學(xué)習(xí)和自然語言處理(NLP)方面積累有一定的經(jīng)驗(yàn)。業(yè)余時(shí)間喜愛翻譯創(chuàng)作,翻譯作品主要有:IEC-ISO 7816、伊拉克石油工程項(xiàng)目、新財(cái)稅主義宣言等等,其中中譯英作品“新財(cái)稅主義宣言”在GLOBAL TIMES正式發(fā)表。能夠利用業(yè)余時(shí)間加入到THU 數(shù)據(jù)派平臺的翻譯志愿者小組,希望能和大家一起交流分享,共同進(jìn)步

          翻譯組招募信息

          工作內(nèi)容:需要一顆細(xì)致的心,將選取好的外文文章翻譯成流暢的中文。如果你是數(shù)據(jù)科學(xué)/統(tǒng)計(jì)學(xué)/計(jì)算機(jī)類的留學(xué)生,或在海外從事相關(guān)工作,或?qū)ψ约和庹Z水平有信心的朋友歡迎加入翻譯小組。

          你能得到:定期的翻譯培訓(xùn)提高志愿者的翻譯水平,提高對于數(shù)據(jù)科學(xué)前沿的認(rèn)知,海外的朋友可以和國內(nèi)技術(shù)應(yīng)用發(fā)展保持聯(lián)系,THU數(shù)據(jù)派產(chǎn)學(xué)研的背景為志愿者帶來好的發(fā)展機(jī)遇。

          其他福利:來自于名企的數(shù)據(jù)科學(xué)工作者,北大清華以及海外等名校學(xué)生他們都將成為你在翻譯小組的伙伴。


          點(diǎn)擊文末“閱讀原文”加入數(shù)據(jù)派團(tuán)隊(duì)~



          轉(zhuǎn)載須知

          如需轉(zhuǎn)載,請?jiān)陂_篇顯著位置注明作者和出處(轉(zhuǎn)自:數(shù)據(jù)派ID:DatapiTHU),并在文章結(jié)尾放置數(shù)據(jù)派醒目二維碼。有原創(chuàng)標(biāo)識文章,請發(fā)送【文章名稱-待授權(quán)公眾號名稱及ID】至聯(lián)系郵箱,申請白名單授權(quán)并按要求編輯。

          發(fā)布后請將鏈接反饋至聯(lián)系郵箱(見下方)。未經(jīng)許可的轉(zhuǎn)載以及改編者,我們將依法追究其法律責(zé)任。



          點(diǎn)擊“閱讀原文”擁抱組織



          瀏覽 72
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜操综合网二区 | 久久三级免费 | 久久精品无码一区二区三区免费 | 国产高潮久久 | 亚洲偷|