如何使用 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; }