2016-04-22 226 views
3
  • 我想將BGR圖像轉換爲ABGR/ARGB。在opencv中轉換BGR2RGBA,但不轉換BGR2ABGR或BGR2ARGB。
  • 這可能與opencv或使用任何其他方法?
+1

你可以用'BGR2BGRA'轉換,然後按['mixChannels'](http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#混頻道)重新排序頻道。 – sgarizvi

+0

如果我重新排列頻道,那麼它會正常工作? – Sagar

+0

它應該工作正常。嘗試一下,看看會發生什麼。如果它不起作用,您可以隨時拆分頻道,重新排序和合並。 – sgarizvi

回答

3

所需的操作可以通過使用cv::mixChannels如下調換圖像通道來完成:

cv::Mat bgr, bgra; 

//bgr initialization code here... 
//. 
//. 
//. 
cv::cvtColor(bgr, bgra, cv::COLOR_BGR2BGRA); 
cv::Mat abgr(bgra.size(), bgra.type()); 
int from_to[] = { 0,3, 1,1, 2,2, 3,0 }; 
cv::mixChannels(&bgra,1,&abgr,1,from_to,4); 

from_to陣列是映射函數,它指定從源信道將被複制到該目標圖像的頻道。在對指示輸入的信道號0將被複制到的通道號3輸出的,1122,和信道數目3將被複制到通道的輸出的數目0

或者,我們可以拆分圖像通道,交換所需通道並重新合併。這是可以做到如下:

cv::cvtColor(bgr, bgra, cv::COLOR_BGR2BGRA); 

std::vector<cv::Mat> channels_bgra; 
cv::split(bgra, channels_bgra); 

std::vector<cv::Mat> channels_abgr = { channels_bgra[3], channels_bgra[1], channels_bgra[2], channels_bgra[0] }; 
cv::merge(channels_abgr, abgr); 
2

OpenCV的不支持ARGB或ABGR格式,所以你將無法顯示或使用上的一些它的功能......不過,就可以與splitmerge功能創建它們OpenCV的。這裏有一些代碼來解釋我的意思。

cv::Mat src, final_image; 
// fill src as you prefer 
std::vector<cv::Mat> channels; 
cv::split(src, channels); // this will put each channel in a mat in the vector 

// swap or add channels in the vector 
cv::Mat alpha(src.rows, src.cols, CV_8U, cv::Scalar(255)); 
channels.push_back(alpha); 
std::reverse(channels.begin(), channels.end()); //needs <algorithm> 

// merge the channels in one new image 
cv::merge(channels, final_image); 

這是可以做到更快(也許這將是多麼短)與功能mixChannels,但我會說,這是一個更加混亂一點點。

相關問題