QImage 與 cv Mat 之間的相互轉換

2021-08-02 06:30:07 字數 1792 閱讀 9007

【**】

最近做影象處理方面的專案比較多,很多演算法自己從頭寫的話太浪費時間,而且自己寫的也不一定完善,早就聽說opencv

在影象處理演算法方面功能很強大,一直沒時間學習,這次正好專案用到了,臨時抱佛腳學習些

opencv

入門知識。因為我的程式介面都是用

qt寫的,因此也花了點時間研究了如何將

opencv 

和qt 

融合在一起,協同工作。

qt 中處理影象主要用的是

qimage

類,opencv

中主要用的是

cv::mat

類。下面的兩個函式可以用來實現這兩個類相互轉換。

[cpp]view plain

copy

print?

qimage cvmat2qimage(const cv::mat& mat)  

// copy input mat

uchar *psrc = mat.data;  

for(int row = 0; row < mat.rows; row ++)  

return image;  

}  // 8-bits unsigned, no. of channels = 3

else

if(mat.type() == cv_8uc3)  

else

if(mat.type() == cv_8uc4)  

else

}  cv::mat qimage2cvmat(qimage image)  

return mat;  

}  

qimage cvmat2qimage(const cv::mat& mat)

// copy input mat

uchar *psrc = mat.data;

for(int row = 0; row < mat.rows; row ++)

return image;

}// 8-bits unsigned, no. of channels = 3

else if(mat.type() == cv_8uc3)

else if(mat.type() == cv_8uc4)

else

}cv::mat qimage2cvmat(qimage image)

return mat;

}

程式比較簡單,就不多說明了。唯一需要注意的是cvmat 和qimage 對於rgba 這四個分量的排列順序是不相同的。轉換的時候需要調換一下。但是qt 的文件中說的很明確,qimage內部資料儲存的方式不能保證以後永遠不變。所以這個**也不能保證一直是可用的。

下面是五個測試用例。基本上把各種常見情況都覆蓋了。

[cpp]view plain

copy

print?

void test1()  

void test2()  

void test3()  

void test4()  

void test5()  

int main(int argc, char *argv)    

void test1()

void test2()

void test3()

void test4()

void test5()

int main(int argc, char *argv)

QImage 與 cv Mat 之間的相互轉換

近期做影象處理方面的專案比較多,非常多演算法自己從頭寫的話太浪費時間,並且自己寫的也不一定完好,早就聽說opencv 在影象處理演算法方面功能非常強大,一直沒時間學習,這次正好專案用到了。暫時抱佛腳學習些 opencv 入門知識。由於我的程式介面都是用 qt寫的,因此也花了點時間研究了怎樣將 ope...

QImage和cv Mat的相互轉換

一 實現思路 qimage和cv mat的畫素資料都是儲存在堆上的uchar陣列中,詳情見 cv mat的記憶體結構與訪問 因此實現qimage和cv mat的相互轉換,只需要拷貝堆上的uchar陣列即可。二 c 實現淺拷貝 todo 淺拷貝注意事項與c 三 c 實現深拷貝 1 ly opencv ...

CvMat 和cv Mat之間的區別

cv mat是乙個類 class 而cvmat是乙個struct,從型別上就可以知道二者存在很大區別。前者除了幾個成員變數之外還有很多的成員函式和過載函式,可以實現很多的影象資料處理功能,而後者只有幾個成員變數,要對其成員進行一些處理,需要借用別的函式。typedef struct cvmat da...