1. 程式人生 > >opencv中的Mat與陣列互轉

opencv中的Mat與陣列互轉

直接上程式碼,初步驗證測試正確,陣列形式與opencv的儲存方式一致為BGR。

cv::Mat TransBufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB = 1)
{
    cv::Mat mDst;
    if (nBandNum == 4)
    {
        if (nBPB == 1)
        {
            mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC4);
        }
        else if (nBPB == 2)
        {
            mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC4);
        }
    }
    else if (nBandNum == 3)
    {
        if (nBPB == 1)
        {
            mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC3);
        }
        else if (nBPB == 2)
        {
            mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC3);
        }
    }
    else if (nBandNum == 1)
    {
        if (nBPB == 1)
        {
            mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_8UC1);
        }
        else if (nBPB == 2)
        {
            mDst = cv::Mat::zeros(cv::Size(nWidth, nHeight), CV_16UC1);
        }
    }

    for (int j = 0; j < nHeight; ++j)
    {
        unsigned char* data = mDst.ptr<unsigned char>(j);
        unsigned char* pSubBuffer = pBuffer + (nHeight - 1 - j) * nWidth  * nBandNum * nBPB;
        memcpy(data, pSubBuffer, nWidth * nBandNum * nBPB);
    }
    if (nBandNum == 1)
    {
        cv::cvtColor(mDst, mDst, CV_GRAY2BGR);
    }
    else if (nBandNum == 3)
    {
        cv::cvtColor(mDst, mDst, CV_RGB2BGR);
    }
    else if (nBandNum == 4)
    {
        cv::cvtColor(mDst, mDst, CV_RGBA2BGR);
    }

    return mDst;
}

int TransMatToBuffer(cv::Mat mSrc, unsigned char** ppBuffer, int& nWidth, int& nHeight, int& nBandNum, int& nBPB)
{
    if (*ppBuffer)
    {
        delete[] * ppBuffer;
        *ppBuffer = nullptr;
    }

    nWidth = mSrc.cols;
    //nWidth = ((nWidth + 3) / 4) * 4;
    nHeight = mSrc.rows;
    nBandNum = mSrc.channels();
    nBPB = (mSrc.depth() >> 1) + 1;

    size_t nMemSize = nWidth * nHeight * nBandNum * nBPB;
    //這樣可以改變外部*pBuffer的值
    *ppBuffer = new uchar[nMemSize];
    memset(*ppBuffer, 0, nMemSize);
    uchar* pT = *ppBuffer;
    for (int j = 0; j < nHeight; ++j)
    {
        unsigned char* data = mSrc.ptr<unsigned char>(j);
        unsigned char* pSubBuffer = *ppBuffer + (j)* nWidth  * nBandNum * nBPB;
        memcpy(pSubBuffer, data, nWidth * nBandNum * nBPB);
    }

    return 0;
}
更多的交流,歡迎加入 暗號271888395

相關推薦

opencvMat陣列

直接上程式碼,初步驗證測試正確,陣列形式與opencv的儲存方式一致為BGR。cv::Mat TransBufferToMat(unsigned char* pBuffer, int nWidth, int nHeight, int nBandNum, int nBPB =

opencvMat陣列之間值傳遞的方法

1.將陣列內容傳遞給Mat 示例程式碼: unsigned char cbuf[height][width]; cv::Mat img(height, width, CV_8UC1, (unsigned char*)cbuf); 1 2 2.將Mat中的內容傳遞給

樹莓派3B在QT環境下使用opencv呼叫自帶攝像頭使用拍照,記憶體bmpjpg

樓主最近在做一個人臉識別的專案,剛好有個一個樹莓派3B,於是準備拿來做終端使用,使用命令列和python拍照都很簡單,但是速度感人,就想使用opencv拍照,結果網上很多方法都有問題,只能使用USB的攝像頭,最終用了gayhub上的一個開源專案raspicam成功呼叫了ope

dlib的image和opencv的image格式

//dlib::array2d is an image already, you can use it for any dlib's image functions //load image: dlib::array2d<dlib::rgb_pixe

pythonstrlist

1、list轉str 假設有一個名為test_list的list,轉換後的str名為test_str 則轉換方法: test_str = "".join(test_list) 需要注意的是該方法需要list中的元素為字元型,若是整型,則需要先轉換為字元型後再轉為str型別。

OpenCVMatAndroidBitmap簡介

        因為在介紹這部分系列的內容時,預設是對Android開發有一點基礎的,所以這樣的話,Bitmap可能就相對很熟悉了,相較陌生的是Mat,那我們就首先來看看Mat是什麼。 1,Mat 1.1 Mat基本介紹 Mat是OpenCV中用於

Pythonrgbycbcr

mat = np.array( [[ 65.481, 128.553, 24.966 ], [-37.797, -74.203, 112.0 ], [ 112.0, -9

MatQImage

1、MatConvertQImage.hpp #ifndef MATQIMAGE_HPP #define MATQIMAGE_HPP #include <QImage> #include <opencv2/core/core.hpp> #include <openc

Halcon 字串HTuple,doubleHTupleMatHObject

Opencv和Halcon直接有很多資料要轉換,特此記錄1 字串與HTuple互轉char *pImageName = "D:/data/temp.png"; HTuple hv_path; hv_path = (HTuple)(pImageName); cout <&

MFCUTF8GB2312

 UTF8轉GB2312 CString CMyBrowserDlg::ConvertUTF8toGB2312(CString str) {     int len = str.GetLength

C# 物件Json的方法整理筆記

前言          原先一直做CS的開發,對Json瞭解不多,最近轉做BS後,才接觸到了Json。作為後臺與前端頁面資料互動的基礎,Json的地位非常重要,自然而然Json轉換方法的重要性也不言面喻。 最開始使用的是同事原來寫好的物件轉Json的方法,並沒有什麼問題,

Java 10進位制byte陣列16進位制byte陣列 及 在DES加解密的使用

一、10進位制byte陣列與16進位制byte陣列互轉 1. 10進位制byte陣列轉成16進位制byte陣列 Java中10進位制byte用二進位制表示佔用8位,16進位制的每個字元需要用4位二進位制位來表示,則將每一個10進位制 位元組的高4位、低4位分別進行處理,對應

OpencvMat結構體元素的獲取賦值

【OpenCV3影象處理】Mat中元素的獲取與賦值 ( 對比.at<>()函式 和 .ptr<>()函式) 2017年04月12日 10:08:55 閱讀數:7542 標籤: opencvopencv3 更多 個人分類:&nbs

C#unitybase64string和圖片

C#: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; using

sql server 和 oracle ,ip數字

(一)Oracle中: (1) IP轉為數字: createorreplacefunction ip2number(ip varchar2)    return number   is  

C++ 動態分配陣列空間,以及opencvMat類的初始化

在C++中,如果想要申請動態陣列,必須要用動態分配的方式。 int **matrix=new int*[num_of_rows]; for(int i=0;i<num_of_rows;i++){ int *row=new int[num_of

使用OpenCvMat進行水平投影垂直投影並實現字元切分

因為要做影象處理方面的工作,所以最近在學習OpenCv的使用,學習了OpenCv中Mat物件的相關使用之後,實現了使用Mat物件來進行影象的水平投影和垂直投影,並且在投影之後,對字元進行相對應的切分。現在將相關程式碼貼出,一來可以供大家參考並指正錯誤,而來也為的是防止忘記了

java的二進位制intbyte以及&0xff的作用

1.      按位與&  :兩位全位1,結果才為1; 0&0=0;  0&1=0  ; 1&1=1 如:51 &5 =0011 0011 & 0000 0101=0000 0001 = 1 作用:清零、取一個數中指定位(即

Javanet.sf.json包關於JSON物件的坑

在Web開發過程中離不開資料的互動,這就需要規定互動資料的相關格式,以便資料在客戶端與伺服器之間進行傳遞。資料的格式通常有2種:1、xml;2、JSON。通常來說都是使用JSON來傳遞資料。本文正是介紹在Java中JSON與物件之間互相轉換時遇到的幾個問題以及相

JavaList和String【】陣列

將List轉成陣列 1.List轉陣列 /** * List to Array * @param list * @return