[OPENCV] 第一個程序 識別顏色

它能夠鑑別出圖像中含有給定顏色的全部像素,該算法輸入的是圖像以及顏色,並返回表示含有指定顏色的像素的二值圖像。該算法還須要指定另一個參數,即對顏色誤差的容忍度。ios

實現效果算法

實現後ui

 

 1 #include <QCoreApplication>
 2 #include <opencv2/core/core.hpp>
 3 #include <opencv2/highgui/highgui.hpp>
 4 #include<cstdio>
 5 #include<iostream>
 6 
 7 class ColorDector{
 8 private:
 9     int minDist;
10     cv::Vec3b target;
11     cv::Mat result;
12 public:
13 ColorDector(){
14     minDist=100;
15     target[0]=target[1]=target[2]=0;
16 }
17 cv::Mat process(const cv::Mat &image){
18     //分配新的陣列數據
19     result.create(image.rows,image.cols,CV_8U);
20     cv::Mat_<cv::Vec3b>::const_iterator it=image.begin<cv::Vec3b>();
21     cv::Mat_<cv::Vec3b>::const_iterator itend=image.end<cv::Vec3b>();
22     cv::Mat_<uchar>::iterator itout=result.begin<uchar>();
23     for(;it!=itend;++it,++itout){
24         if(getDistance(*it)<minDist){
25             *itout=255;
26         }
27         else{
28             *itout=0;
29         }
30     }
31     return result;
32 }
33 
34 int getDistance(const cv::Vec3b& color)const{
35     return abs(color[0]-target[0])+abs(color[1]-target[1])+abs(color[2]-target[2]);
36 }
37 void setColorDistanceThreadhold(int distance){
38     if(distance<0)  distance=0;
39     minDist=distance;
40 }
41 
42 int getColorDIstanceThreshold()const{
43     return minDist;
44 }
45 void setTargetColor(unsigned char red,unsigned char green,unsigned char blue){
46     target[2]=red;
47     target[1]=green;
48     target[0]=blue;
49 }
50 };
51 int main()
52 {
53 
54     ColorDector cdetect;
55     cv::Mat image=cv::imread("C:/Users/Administrator/Desktop/1.jpg");
56     if(!image.data) return 0;
57     cv::Mat climage=image.clone();
58     cdetect.setTargetColor(220,220,200);
59     cv::namedWindow("result");
60     cv::imshow("result",cdetect.process(climage));
61     //cv::imshow("result",climage);
62     cv::waitKey();
63 
64 
65     return 0;
66 }
相關文章
相關標籤/搜索