0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenCV的Mat數據格式及其遍歷的程序資料說明

C語言專家集中營 ? 來源:未知 ? 2019-02-17 09:42 ? 次閱讀

在opencv早期的版本中,圖像通過一個叫做IplImage的結構(structure)存儲在內存中。由于C語言程序員高度的信任,因此它需要手動地對內存進行管理,比如內存的分配和回收,這在大型程序設計中是比較麻煩的。幸運地是,C++可以很好地幫助程序員管理內存,因此opencv2.0后就引入了C++接口。但是C++也有缺點,比如說目前大部分的嵌入式系統(tǒng)只支持C語言,在這些平臺上開發(fā)opencv程序的話用C++就不是很好。

cv::Mat是一個C++類,包含兩部分:1)Matrix header,包括矩陣的size、存儲方式、矩陣的存儲地址等信息;2)指向Marix的指針ji。由于圖像處理算法通常都是計算密集型算法,出于程序速度上的考慮,opencv的設計應盡可能地避免拷貝大圖像,為了解決這個問題,opencv使用了引用計數機制(reference counter system)【python也使用了這個機制,參考之前的博客】。簡單來說,滅個Mat對象都有自己的header,在進行copy運算時,只有headers和指向矩陣的指針會被拷貝,而矩陣本身不會被拷貝,舉個栗子:

上面的三個Mat對象srcImg,dstImg,C最終都只想同一個數據矩陣,雖然它們的headers是不同的。對它們其中的任意一個進行修改都會影響另外兩個對象。上面程序的運行結果如圖:

當然,如果想拷貝矩陣本身也是有辦法的,opencv提供了兩個方法:clone()和copyTo():

Mat F = A.clone();

Mat G;

A.copyTo(G);

最后總結一下:

1)opencv函數中輸出圖像的內存是自動分配的;

2)賦值運算和拷貝構造函數只是拷貝了header,我們可以把這種拷貝理解為一種淺拷貝;

3)如果想進行深拷貝,即拷貝矩陣本身的數據,可以采用clone()或copyTo()函數。

對1和2的理解可以很重要,這可以解釋下面這個程序:

其運行結果為:

關于如何創(chuàng)建一個Mat對象,最好的辦法就是看mat.hpp,因為實在有太多了...,這里在介紹一下opencv里面的一下data

type,比如說CV_8UC3,CV_32FC3,CV_32F是什么意思:

CV_[the number of bits per item][signed or unsigned][Type prefix]C[The channel number]

最后是一個大頭部分:介紹如何遍歷cv::Mat。

Q1:圖像在Mat中是如何存儲的呢?

通常我們有足夠多的內存,使得上面這個矩陣可以一行接著一行地連續(xù)存儲,具體是不是呢,可以用isContinous()函數來判斷。因此最高效的遍歷方法還是采用指針(還有迭代器方法):

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • C++
    C++
    +關注

    關注

    21

    文章

    2085

    瀏覽量

    73301
  • OpenCV
    +關注

    關注

    29

    文章

    622

    瀏覽量

    41088
  • python
    +關注

    關注

    53

    文章

    4753

    瀏覽量

    84070

原文標題:opencv——Mat數據格式及其遍歷

文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    VTHD這個寄存器的數據格式是?3.21帶符號格式是什么格式?

    VTHD這個寄存器的數據格式是?3.21帶符號格式是什么格式?沒有找到相關說明,那位高人給兄弟指點下,非常感謝!
    發(fā)表于 12-27 07:56

    標準數據格式實用程序快速參考

    標準數據格式實用程序快速參考
    發(fā)表于 01-22 11:32

    標準數據格式實用程序

    標準數據格式實用程序
    發(fā)表于 01-23 17:02

    海洋環(huán)境信息數據格式分析研究

    海洋環(huán)境信息是海洋科學研究與信息交流的重要基礎,其數據格式的標準化不僅影響數據的交互性,也是影響海洋環(huán)境信息共享的關鍵所在。目前,國內外海洋環(huán)境信息數據格式多種
    發(fā)表于 02-22 16:05 ?7次下載

    數據格式,計算機中數據格式詳細介紹

    數據格式,計算機中數據格式詳細介紹    計算機中常用的數據表示格式有兩種,一是定點格式,二是浮點格式
    發(fā)表于 04-13 11:36 ?3568次閱讀

    gps數據格式含義說明

    本內容介紹了gps數據格式的含義,給出了GPS輸出的是NMEA-0183的數據格式,GPS固定數據輸出語句($GPGGA)
    發(fā)表于 12-19 14:57 ?1.3w次閱讀

    遍歷圖像像素的14種方法_OpenCV2版書本配套示例程序24

    遍歷圖像像素的14種方法_OpenCV2版書本配套示例程序24,來自一本國外OpenCV2書籍的示例-遍歷圖像像素的14種方法。
    發(fā)表于 06-06 15:20 ?0次下載

    opencv中三種常見數據容器:Mat,cvMat和IplImage及它們編程顯示圖像的差異

    IplImage, CvMat, Mat 的關系opencv中常見的與圖像操作有關的數據容器有Mat,cvMat和IplImage,這三種類型都可以代表和顯示圖像,但是,
    發(fā)表于 11-25 13:18 ?6509次閱讀

    java生成json格式數據 和 java遍歷json格式數據

    本文檔內容介紹了基于java生成json格式數據 和 java遍歷json格式數據,供參考
    發(fā)表于 03-19 15:04 ?0次下載

    OPENCV數據容器之CVMAT 、MAT、IplImage

    之前的cvMat和lplImage,相比之下Mat最大的好處就是能夠更加方便的進行內存管理,不再需要程序員手動管理內存的釋放。opencv2.3中提到Mat是一個多維的密集
    發(fā)表于 06-15 18:36 ?317次閱讀

    TPC TP協議族簡單解讀及網絡數據格式及封裝和解包的資料概述

    本文檔的主要內容詳細介紹的是TPC TP協議族簡單解讀及網絡數據格式及封裝和解包的資料概述。
    發(fā)表于 04-24 18:30 ?1次下載
    TPC TP協議族簡單解讀及網絡<b class='flag-5'>數據格式</b>及封裝和解包的<b class='flag-5'>資料</b>概述

    如何使用OpenCV訪問Mat圖像中每個像素的值

    本文檔的主要內容詳細介紹的是如何使用OpenCV訪問Mat圖像中每個像素的值
    發(fā)表于 11-26 16:13 ?4次下載

    總結一下OpenCV遍歷圖像的幾種方法

    在圖形處理中,遍歷每個像素點是最基本的功能,是做算法的基礎,這篇文章來總結一下OpenCV遍歷圖像的幾種方法。
    的頭像 發(fā)表于 01-18 15:08 ?1591次閱讀

    串口通訊的基本概念、數據格式

    本文介紹了串口通訊的基本概念、數據格式、通訊方式、典型的串口通訊標準等內容。
    的頭像 發(fā)表于 04-23 11:13 ?5079次閱讀
    串口通訊的基本概念、<b class='flag-5'>數據格式</b>

    如何實現PIL和OpenCV之間圖像數據的轉換呢?

    PIL圖像數據格式轉換成OpenCV圖像數據格式
    的頭像 發(fā)表于 02-25 13:43 ?993次閱讀