簡體   English   中英

opencv二進制數據jpg圖像到cv :: Mat

[英]opencv binary data jpg image to cv::Mat

我想在c ++ opencv中加載來自postgresql數據庫的圖像。 圖像jpg擴展名以二進制數據(字節類型)存儲在基礎數據庫中,由於libpqxx我可以訪問它。

問題是我不知道如何將數據轉換為cv :: Mat實例。 對於常規圖像,我可以使用imread('myImage.jpg',...),但是在這種情況下,我什至無法將數據庫圖像加載到Mat的data屬性中,因為它是jpeg而不是bmp。

任何想法 ? 我可以使用一些opencv方法來直接理解二進制數據並將其轉換為適當的結構嗎? imdecode()函數似乎用於位圖數據。

編輯:Berak,使用向量,imdecode函數將返回空矩陣。發生的情況“如果緩沖區太短或包含無效數據,則返回空矩陣/圖像。” 這是代碼:

pqxx::result r=bdd::requete("SELECT image FROM lrad.img WHERE id=3",1);//returns the bytea image in r[0]["image"]
const char* buffer=r[0]["image"].c_str();    
vector<uchar>::size_type size = strlen((const char*)buffer);
vector<uchar> jpgbytes(buffer, buffer+size);
Mat img = imdecode(jpgbytes, CV_LOAD_IMAGE_COLOR); 
//jpgbytes.size()=1416562 img.size()=[0 x 0]

我想念什么?

仍然,使用imdecode 它可以處理png,jpg,bmp,ppm,webp,jp2,exr,但沒有gif。

vector<uchar> jpgbytes; // from your db
Mat img = imdecode(jpgbytes);

(對於bmp或任何其他受支持的格式,您應該執行相同的操作,不要與Mat的原始數據指針搞混!)

好的,我有一個將BYtea數據轉換為cv :: Mat的過程,這是代碼。

inline int dec(uchar x){ //convert uchar to int
    if (x>='0'&&x<='9') return (x-'0');
    else if (x>='a'&&x<='f') return (x-'a'+10);
    else if (x>='A'&&x<='F') return (x-'A'+10);
    return 0;
}
cv::Mat bytea2Mat(const pqxx::result::field& f){
    const char* buffer=f.c_str();  
    vector<uchar>::size_type size = strlen((const char*)buffer);
    vector<uchar> jpgbytes(size/2-1); 

    for (size_t i=0; i!=size/2-1;i++) { 
        jpgbytes[i]=(dec(buffer[2*(i+1)])<<4)+dec(buffer[2*(i+1)+1]);
    }
    cout <<size/2<<";"<<jpgbytes.size()<<endl;
    return imdecode(jpgbytes, CV_LOAD_IMAGE_COLOR);
}

對於原始輸入字符串“ a b0”(十六進制),bytea輸出被加密為類似於“ \\ x41204230”的char *。 (根據數據輸入\\ x可能不存在)以獲取原始數據,您必須從兩個字符計算原始輸入('4','1'= 0x41 = 65)。 向量是char *大小的一半。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM