OpenCV計算機視覺開發實踐:基于Qt C++ - 商品搜索 - 京東
顏色變換是imgproc模塊中一個常用的功能。我們生活中看到的大多數彩色圖片都是RGB類型的,但是在進行圖像處理時需要用到灰度圖、二值圖、HSV(六角錐體模型,這個模型中顏色的參數分別是色調H、飽和度S、明度V)、HSI等顏色制式,對此OpenCV提供了cvtColor()函數來實現這些功能,這個函數用來進行顏色空間的轉換。隨著OpenCV版本的升級,對于顏色空間種類的支持也越來越多,因此涉及不同顏色空間之間的轉換,比如RGB和灰度的互轉、RGB和HSV的互轉等。
cvtColor函數聲明如下:
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
參數說明如下:
- src:用于輸入圖像,即要進行顏色空間變換的原圖像,可以是Mat類。
- OutputArray dst:用于輸出圖像,即進行顏色空間變換后存儲的圖像,也可以是Mat類。
- code:表示轉換的代碼或標識,即在此確定將什么制式的圖片轉換成什么制式的圖片。
- dstCn:表示目標圖像通道數,默認取值為0,如果取值為0,就由src和code決定。
- InputArray和OutputArray:都是接口類,它們可以是Mat、Mat_<T>、Mat_<T, m, n>、vector<T>、vector<vector<T>>和vector<Mat>。
函數cvtColor的作用是將一個圖像從一個顏色空間轉換到另一個顏色空間,但是當從RGB向其他類型轉換時,必須明確指出圖像的顏色通道。值得注意的是,在OpenCV中,默認的顏色制式排列是BGR而非RGB。因此,對于24位顏色圖像來說,前8位是藍色,中間8位是綠色,最后8位是紅色。
需要注意的是,cvtColor()函數不能直接將RGB圖像轉換為二值圖像,需要借助threshold函數。
我們常用的顏色空間轉換有兩種:BGR轉為灰度圖和BGR轉為HSV。下面來看一個例子,將圖像轉換為灰度圖和HSV。
【例4.1】將圖像轉換為灰度圖和HSV
?? 打開Qt Creator,新建一個控制臺工程,工程名是test。
?? 在IDE中打開main.cpp,輸入如下代碼:
#include <QDebug>
#include <opencv2/imgproc/types_c.h> // for CV_RGB2GRAY
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;int main()
{Mat srcImage = imread("sky.jpg");// 判斷圖像是否加載成功if (!srcImage.data){qDebug() << "圖像加載失敗!";return false;}elseqDebug()<< "圖像加載成功!";// 顯示原圖像namedWindow("src", WINDOW_AUTOSIZE);imshow("src", srcImage);// 將圖像轉換為灰度圖,采用CV_前綴Mat grayImage;cvtColor(srcImage, grayImage, CV_RGB2GRAY); // 將圖像轉換為灰度圖namedWindow("gray", WINDOW_AUTOSIZE);imshow("gray", grayImage);// 將圖像轉換為HSV,采用COLOR_前綴Mat HSVImage;cvtColor(srcImage, HSVImage, COLOR_BGR2HSV); // 將圖像轉換為HSVnamedWindow("HSV", WINDOW_AUTOSIZE);imshow("HSV", HSVImage);waitKey(0);return 0;
}
保存工程并運行,結果如圖4-1所示。
圖4-1