OpenCV (C++) 颜色跟随

时间:2021-11-07 10:45:29

 #include<opencv2/opencv.hpp>
#include<iostream> using namespace cv;
using namespace std; Rect roi;
Mat frame, mask;
void processFrame(Mat &binary, Rect &rect); int main(int argc, char* argv) {
VideoCapture capture();//打开摄像头
if (!capture.isOpened()) {
printf("Could not find Video data..");
return -;
} Mat kernel1 = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
Mat kernel2 = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -)); namedWindow("input_Video", CV_WINDOW_AUTOSIZE);
namedWindow("mask_Video", CV_WINDOW_AUTOSIZE);
while (capture.read(frame))//读取当前帧
{ inRange(frame, Scalar(, , ), Scalar(, , ), mask);//过滤得到Scalar1到Scalar2之间的图像 //形态学操作
morphologyEx(mask, mask, MORPH_OPEN, kernel1, Point(-, -));//开操作,去掉噪声
dilate(mask, mask, kernel2, Point(-, -), );//膨胀,填补空洞
imshow("mask_Video", mask); processFrame(mask, roi); // 轮廓发现与位置标定
rectangle(frame, roi, Scalar(, , ), , , );//画出外接矩形
imshow("input_Video", frame); char c = waitKey();//延时100ms
if (c == ) //等待“Esc”
{
break;
}
}
capture.release();//释放视频的内存
waitKey();
return ; } //binary:输入图像
//rect:返回的ROI区域
void processFrame(Mat &binary, Rect &rect) {
Point p, center;
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
//发现最外层轮廓
findContours(binary, contours, hireachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(, )); if (contours.size() > ) //判断是否有轮廓被找到
{
double maxArea = 0.0;
for (size_t t = ; t < contours.size(); t++) {
double area = contourArea(contours[static_cast<int>(t)]);//获取轮廓的面积
if (area > maxArea)//面积筛选,只画出最大的轮廓
{
maxArea = area;
rect = boundingRect(contours[static_cast<int>(t)]);//获取最小外界矩形 //计算并输出坐标
center.x = rect.x + cvRound(rect.width / 2.0);
center.y = rect.y + cvRound(rect.height / 2.0);
center.x = center.x - frame.cols / ;
center.y = center.y - frame.rows / ; cout << center.x << "," << center.y << endl;
}
} }
else {
rect.x = rect.y = rect.width = rect.height = ;
} }

 inRange()函数 :

此函数作用:可实现二值化功能(这点类似threshold()函数),更关键的是可以同时针对多通道进行操作,使用起来非常方便! 主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。

void inRange(InputArray src, InputArray lowerb,
InputArray upperb, OutputArray dst);

参数解释:

参数1:输入要处理的图像,可以为单通道或多通道。

参数2:包含下边界的数组或标量。

参数3:包含上边界数组或标量。

参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。

请注意:该函数输出的dst是一幅二值化之后的图像。