【**】
最近做影象處理方面的專案比較多,很多演算法自己從頭寫的話太浪費時間,而且自己寫的也不一定完善,早就聽說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...