綠幕影像的背景替換
- 一、色彩空間轉換
- 二、提取綠幕區域
- 三、替換背景
綠幕影像的背景替換需要經歷①色彩空間轉換、②提取綠幕區域、③反轉綠幕區域、④復制影像,其中遇到的各種函式和代碼也都在本文有詳細介紹,
一、色彩空間轉換
??要去除綠幕影像中的綠幕,首先需要將影像轉換到hsv色彩空間,這樣方便后續對影像的處理,使用 cvtcolor() 函式可以完成色彩空間的轉換,
void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0)
| 引數 | 作用 |
|---|---|
| InputArray src | 輸入影像矩陣 |
| OutputArray dst | 輸出影像矩陣 |
| int code | 轉換方式 |
| int dstCn | 目標影像通道數 |
一般的使用方法如下,影像轉換至hsv色彩空間的示例程式:
void MyDemo::inRange_Demo(Mat& image) {
Mat hsv; //存盤轉換后的hsv影像
cvtColor(image, hsv, COLOR_BGR2HSV);//進行色彩空間轉換
imshow("hsv_image", hsv);
}
二、提取綠幕區域
??影像轉換到hsv色彩空間后,就可以進行色彩區域的提取了,這里使用的函式是 inRange() ,
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);
| 引數 | 功能 |
|---|---|
| InputArray src | 輸入影像 |
| InputArray lowerb | 下邊界陣列閾值 |
| InputArray upperb | 上邊界陣列閾值 |
| OutputArray dst | 輸出影像 |
其中,由于HSV的取值范圍為H(0-180)、S(0-255)、V(0-255),因此上下邊界陣列閾值可以通過如下表格獲取
| ? | 黑 | 灰 | 白 | 紅 | 橙 | 黃 | 綠 | 青 | 藍 | 紫 |
|---|---|---|---|---|---|---|---|---|---|---|
| hmin | 0 | 0 | 0 | 0/156 | 11 | 26 | 35 | 78 | 100 | 125 |
| hmax | 180 | 180 | 180 | 10/180 | 25 | 34 | 77 | 99 | 124 | 155 |
| smin | 0 | 0 | 0 | 43 | 43 | 43 | 43 | 43 | 43 | 43 |
| smax | 255 | 43 | 30 | 255 | 255 | 255 | 255 | 255 | 255 | 255 |
| vmin | 0 | 46 | 221 | 46 | 46 | 46 | 46 | 46 | 46 | 46 |
| vmax | 46 | 220 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 |
??由于本文要替換綠幕,所以選擇綠色的閾值,分別是:hmin=35、hmax=77、smin=43、smax=255、vmin=46、vmax=255,因此可以得到下邊界陣列為 Scalar(35, 43, 46) ,上邊界陣列為 Scalar(77, 255, 255) ,
??因此提取綠幕的程式如下:
void MyDemo::inRange_Demo(Mat& image) {
Mat hsv; //存盤轉換后的hsv影像
cvtColor(image, hsv, COLOR_BGR2HSV);//進行色彩空間轉換
Mat mask; //存盤提取綠幕區域后的影像
inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
imshow("mask", mask);
}
三、替換背景
??前面已經完成了對綠幕區域的提取,接下來只需要對提取的區域反轉,選擇人物的區域,進而將人物復制到新背景即可,
??反轉選擇區域使用的是 bitwise_not() 函式,
??復制影像使用的是 image.copyTo(newimage,mask) 方法,作用是把mask和image重疊以后把mask中像素值為0(黑色)的點對應的image中的點變為透明,而保留其他點,將保留的點拷貝到newimage中,
void MyDemo::inRange_Demo(Mat& image) {
//轉換色彩空間
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
//提取綠幕區域
Mat mask;
inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
imshow("mask", mask);
//反轉提取人物區域
bitwise_not(mask, mask);
//人物復制到新背景中
Mat bg = imread("E:/Program/OpenCV/vcworkspaces/opencv_452/img/plantbg.jpg");//背景圖片
image.copyTo(bg, mask);
imshow("Finished", bg);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289704.html
標籤:其他
上一篇:三子棋小游戲(C語言版本)
