如何使用 C++ 中的 OpenCV 检测颜色?

opencvc++server side programmingprogramming更新于 2025/5/14 8:52:17

我们将了解如何检测特定颜色并根据颜色跟踪对​​象。颜色检测和基于颜色检测的跟踪系统的性能取决于环境。

如果改变房间的光线或改变背景颜色,颜色检测将受到很大影响。

以下程序演示了如何使用 C++ 中的 OpenCV 检测颜色。

示例

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
   VideoCapture video_load(0);//从默认相机捕获视频//
   namedWindow("Adjust");//声明显示图像的窗口//
   int Hue_Lower_Value = 0;//初始色调值(下)//
   int Hue_Lower_Upper_Value = 22;//初始色调值(上)//
   int Saturation_Lower_Value = 0;//初始饱和度(下)//
   int Saturation_Upper_Value = 255;//初始饱和度(上)//
   int Value_Lower = 0;//初始值(下)//
   int Value_Upper = 255;//初始饱和度(上)//
   createTrackbar("Hue_Lower", "Adjust", &Hue_Lower_Value, 179);//下色调的跟踪栏//
   createTrackbar("Hue_Upper", "Adjust", &Hue_Lower_Upper_Value, 179);//下-上色调的跟踪栏//
   createTrackbar("Sat_Lower", "Adjust", &Saturation_Lower_Value, 255);//用于较低饱和度的跟踪条//
   createTrackbar("Sat_Upper", "Adjust", &Saturation_Upper_Value, 255);//用于较高饱和度的跟踪条//
   createTrackbar("Val_Lower", "Adjust", &Value_Lower, 255);//用于较低值的跟踪条//
   createTrackbar("Val_Upper", "Adjust", &Value_Upper, 255);//上限值的跟踪条//
   while (1) {
      Mat actual_Image;//用于加载实际图像的矩阵//
      bool temp = video_load.read(actual_Image);//从视频流将实际图像加载到矩阵//
      Mat convert_to_HSV;//声明一个矩阵来存储转换后的图像//
      cvtColor(actual_Image, convert_to_HSV, COLOR_BGR2HSV);//将 BGR 图像转换为 HSV 并将其存储在 convert_to_HSV 矩阵中//
      Mat detection_screen;//声明将检测对象的窗口矩阵//
      inRange(convert_to_HSV,Scalar(Hue_Lower_Value,Saturation_Lower_Value, Value_Lower),Scalar(Hue_Lower_Upper_Value,Saturation_Upper_Value, Value_Upper), detection_screen);//应用轨迹栏修改后的轨迹栏值//
      erode(detection_screen, detection_screen, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));//形态学开运算,用于从前景中移除小物体//
      dilate(detection_screen, detection_screen, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));//形态学开运算,用于从前景中移除小物体//
      dilate(detection_screen, detection_screen, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));//形态学闭运算,用于填充前景中的小洞//
      erode(detection_screen, detection_screen, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));//形态闭合以填充前景中的小孔//
      imshow("Threesholded Image", detection_screen);//显示检测到的物体//
      imshow("Original", actual_Image);//显示实际图像//
      if (waitKey(30) == 27){//如果按下 esc 则中断循环//
         break;
      }
   }
   return 0;
}

输出


相关文章