最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Opencv實現顏色識別

 更新時間:2019年07月23日 10:33:56   作者:qq_37269094  
這篇文章主要為大家詳細介紹了基于Opencv實現顏色識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下

彩色模型  

數字圖像處理中常用的采用模型是RGB(紅,綠,藍)模型和HSV(色調,飽和度,亮度),RGB廣泛應用于彩色監(jiān)視器和彩色視頻攝像機,我們平時的圖片一般都是RGB模型。而HSV模型更符合人描述和解釋顏色的方式,HSV的彩色描述對人來說是自然且非常直觀的。

HSV模型

HSV模型中顏色的參數分別是:色調(H:hue),飽和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年創(chuàng)建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。

(1)色調(H:hue):用角度度量,取值范圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,品紅為300°;

(2)飽和度(S:saturation):取值范圍為0.0~1.0,值越大,顏色越飽和。

(3)亮度(V:value):取值范圍為0(黑色)~255(白色)

RGB轉成HSV

設 (r, g, b) 分別是一個顏色的紅、綠和藍坐標,它們的值是在 0 到 1 之間的實數。設 max 等價于 r, g 和 b 中的最大者。設 min 等于這些值中的最小者。要找到在 HSV 空間中的 (h, s, v) 值,這里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是飽和度和亮度,方法如下:

max=max(R,G,B)

min=min(R,G,B)

if R = max, H = (G-B)/(max-min)

if G = max, H = 2 + (B-R)/(max-min)

if B = max, H = 4 + (R-G)/(max-min) 

H = H * 60

if H < 0, H = H + 360

  • V=max(R,G,B)
  • S=(max-min)/max

OpenCV下有個函數可以直接將RGB模型轉換為HSV模型,OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我們知道H分量基本能表示一個物體的顏色,但是S和V的取值也要在一定范圍內,因為S代表的是H所表示的那個顏色和白色的混合程度,也就說S越小,顏色越發(fā)白,也就是越淺;V代表的是H所表示的那個顏色和黑色的混合程度,也就說V越小,顏色越發(fā)黑。經過實驗,識別藍色的取值是 H在100到140,S和V都在90到255之間。一些基本的顏色H的取值可以如下設置:

Orange 0-22,Yellow 22- 38,Green 38-75,Blue 75-130,Violet 130-160,Red 160-179

具體實現

(1) 讀取一張圖片

cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);

(2)將彩色圖像均衡化 

split(imgHSV, hsvSplit);
equalizeHist(hsvSplit[2],hsvSplit[2]);
merge(hsvSplit,imgHSV);

(3)檢測顏色

inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);

(4)進行開操作和閉操作,去除噪聲的影響。

Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);

代碼:

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
 
using namespace cv;
using namespace std;
 
//入口主函數
int main(int argc, char** argv)
{
 //打開攝像頭,從攝像頭獲取圖像
 VideoCapture cap(0);
 if (!cap.isOpened())
 {
 cout << "Cannot open the web cam"<<endl;
 return -1;
 }
 //創(chuàng)建窗口
 namedWindow("Control",CV_WINDOW_AUTOSIZE);
 
 int iLowH = 100;
 int iHighH = 140;
 
 int iLowS = 90;
 int iHighS = 255;
 
 int iLowV = 90;
 int iHighV = 255;
 //創(chuàng)建進度條
 cvCreateTrackbar("LowH","Control",&iLowH,179);
 cvCreateTrackbar("HighH", "Control", &iHighH,179);
 
 cvCreateTrackbar("LowS", "Control", &iLowS,255);
 cvCreateTrackbar("Highs", "Control", &iHighS,255);
 
 cvCreateTrackbar("LowV", "Control", &iLowV,255);
 cvCreateTrackbar("HighV", "Control", &iHighV,255);
 //while循環(huán)加載圖片
 while (true)
 {
 Mat imgOriginal;
 bool bSuccess = cap.read(imgOriginal);
  
 if (!bSuccess)
 {
 cout << "Cannot read a frame from video stream" << endl;
 break;
 }
 //
 Mat imgHSV;
 vector<Mat> hsvSplit;
 cvtColor(imgOriginal,imgHSV,COLOR_BGR2HSV);
 
 //轉化成直方圖均衡化
 split(imgHSV,hsvSplit);
 equalizeHist(hsvSplit[2],hsvSplit[2]);
 merge(hsvSplit,imgHSV);
 Mat imgThresholded;
 //確定顏色顯示的范圍
 inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS,iHighV),imgThresholded);
 //去除噪點
 Mat element = getStructuringElement(MORPH_RECT,Size(5,5));
 morphologyEx(imgThresholded,imgThresholded,MORPH_OPEN,element);
  //連接連通域
 morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
 imshow("Thresholded Image",imgThresholded);
 imshow("Original",imgOriginal);
 //等待時間
 char Key = (char)waitKey(300);
 if (Key==27)
 {
 break;
 }
 }
 return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Qt5 串口類QSerialPort的實現

    Qt5 串口類QSerialPort的實現

    在Qt5以上提供了QtSerialPort模塊,方便編程人員快速的開發(fā)應用串口的應用程序。本文主要介紹了Qt5 串口類QSerialPort的實現,,感興趣的可以了解一下
    2022-05-05
  • C++如何計算二進制數中1的個數

    C++如何計算二進制數中1的個數

    這篇文章主要介紹了C++如何計算二進制數中1的個數,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 利用C語言實現猜數字小游戲

    利用C語言實現猜數字小游戲

    這篇文章主要為大家詳細介紹了利用C語言實現猜數字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言數據結構之線索二叉樹及其遍歷

    C語言數據結構之線索二叉樹及其遍歷

    這篇文章主要介紹了C語言數據結構之線索二叉樹及其遍歷的相關資料,為了加快查找節(jié)點的前驅和后繼。對二叉樹的線索化就是對二叉樹進行一次遍歷,在遍歷的過程中檢測節(jié)點的左右指針是否為空,如果是空,則將他們改為指向前驅和后繼節(jié)點的線索,需要的朋友可以參考下
    2017-08-08
  • 基于C++實現簡單日期計算器

    基于C++實現簡單日期計算器

    這篇文章主要介紹了基于C++實現簡單日期計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++使用FFmpeg實現YUV數據編碼轉視頻文件

    C++使用FFmpeg實現YUV數據編碼轉視頻文件

    這篇文章主要介紹了C++如何使用FFmpeg實現把一個YUV原始視頻數據(時間序列圖像)經過h264編碼為視頻碼流,然后在使用mp4封裝格式封裝,感興趣的可以了解一下
    2023-06-06
  • C++中strcpy函數的實現

    C++中strcpy函數的實現

    strncpy這個可以指定拷貝字符的長度,指定源地址,目標地址,還有需要拷貝的字符的長度; strcpy只能傳入兩個參數,只指定拷貝的起始地址跟目標地址,然后整體拷貝;
    2015-10-10
  • 深入淺析C++多態(tài)性與虛函數

    深入淺析C++多態(tài)性與虛函數

    多態(tài)是指同樣的消息被不同的對象接收時導致不同的行為。本文通過實例代碼給大家介紹了C++多態(tài)性與虛函數的相關知識,感興趣的朋友一起看看吧
    2020-02-02
  • C++基礎入門教程(一):基礎知識大雜燴

    C++基礎入門教程(一):基礎知識大雜燴

    這篇文章主要介紹了C++基礎入門教程(一):基礎知識大雜燴,本文講解了注釋、頭文件、命名空間等內容,需要的朋友可以參考下
    2014-11-11
  • C++數據結構與算法之反轉鏈表的方法詳解

    C++數據結構與算法之反轉鏈表的方法詳解

    這篇文章主要介紹了C++數據結構與算法之反轉鏈表的方法,結合實例形式分析了C++反轉鏈表的原理、實現方法及相關注意事項,需要的朋友可以參考下
    2017-08-08

最新評論

长海县| 安陆市| 南岸区| 饶平县| 安陆市| 金溪县| 珲春市| 九龙城区| 平安县| 布拖县| 肥城市| 绥宁县| 托克逊县| 怀来县| 辽宁省| 南川市| 云霄县| 浦城县| 绿春县| 临猗县| 兴山县| 洞口县| 金华市| 永城市| 虎林市| 文昌市| 浏阳市| 长春市| 桃园县| 小金县| 招远市| 水城县| 绥芬河市| 原阳县| 墨玉县| 惠州市| 固始县| 邮箱| 紫阳县| 井冈山市| 大安市|