步驟:
1先讀取視頻(or圖片)文件
2將圖像轉換爲hsv
3通過判斷hsv值範圍識別顏色
hsv範圍顏色對應:https://blog.csdn.net/taily_duan/article/details/51506776
示例:識別視頻中的黃色區域,並變成白色顯示
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int H, S, V;
void GetHSV(Mat &image, int div = 64) {
int nl = image.rows; //行數
int nc = image.cols; //列數
for (int j = 0; j < nl; j++)
{
for (int i = 0; i < nc; i++)
{
//-------------開始處理每個像素-------------------
H=image.at<Vec3b>(j, i)[0];
S=image.at<Vec3b>(j, i)[1];
V=image.at<Vec3b>(j, i)[2];
//cout << "H=" << H << "S=" << S << "V=" << V << endl;
if ((H >= 11) && (H <= 34) && (S >= 43) && (S <= 255) && (V >= 46) && (V <= 255))//檢測黃色
{
image.at<Vec3b>(j, i)[0] = 0;
image.at<Vec3b>(j, i)[1] = 0;
image.at<Vec3b>(j, i)[2] = 255;
}
//-------------結束像素處理------------------------
} //單行處理結束
}
}
int main()
{
VideoCapture capture(0);
//【2】循環顯示每一幀
while (1)
{
Mat frame,hsv; //定義一個Mat變量,用於存儲每一幀的圖像
char input;
capture >> frame; //讀取當前幀
cvtColor(frame, hsv, COLOR_BGR2HSV);
GetHSV(hsv);
cvtColor(hsv, hsv, CV_HSV2BGR);
cv::namedWindow("原圖", CV_WINDOW_NORMAL);
cv::namedWindow("轉換圖", CV_WINDOW_NORMAL);
imshow("轉換圖", hsv); //顯示當前幀
imshow("原圖", frame); //顯示當前幀
input = waitKey(100);
if (input == 'q')
{
return 0;
}
}
return 0;
}
效果圖: