opencv 通过轮廓识别提取检测目标

工作中,需要在视频中取出的帧标注出目标物体;
方案之一:通过Canny轮廓识别,寻找轮廓,最后用矩形框选目标;
效果:算法对环境稳定性有要求,特别是阈值的选择。可以对特定的图像特定使用;不适用环境多变,阈值多变的视频取帧中使用;

1.转换为灰度图

cvtColor(org, org, CV_RGB2GRAY);

在这里插入图片描述
2.高斯滤波
void GaussianBlur(InputArray src, //输入图像
OutputArray dst, //输出图像
Size ksize, //高斯滤波器模板大小
double sigmaX, //高斯滤波在横线的滤波系数
double sigmaY,//高斯滤波在竖向的滤波系数
int borderType=BORDER_DEFAULT ) ;//边缘扩展点插值类型

 Mat blur_image;
 GaussianBlur(org, blur_image, Size(3,3), 0,0);

3.Canny 轮廓检测

void cv::Canny( InputArray image,//输入图像:8-bit
OutputArray edges,//输出边缘图像
double threshold1,//双阀值抑制中的低阀值
double threshold2,//双阀值抑制中的高阀值
int apertureSize=3,//sobel算子模板大小,默认为3
bool L2gradient=false );//计算图像梯度幅值的标识,有默认值false

  Mat canny_image;
  Canny(org, canny_image,50, 150);

在这里插入图片描述

4.findContours寻找轮廓
void findContours(InputOutputArray image,//输入图像,二值8位单通道图像,
OutputArrayOfArrays contours,//检测到的轮廓,每个轮廓被表示成一个point向量
OutputArray hierarchy,//可选的输出向量,包含图像的拓扑信息。其中元素的个数和检测到的轮廓的数量相等
int mode,//说明需要的轮廓类型和希望的返回值方式
int method,//轮廓近似方法
Point offset = Point()
)

  vector<vector<Point>>contours;
  findContours(canny_image, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
  1. 对所有点集进行筛选,boundingRect外接矩形
  Rect contours_rect;
  for (int i =1; i < contours.size(); i++){
        if(contours[i].size() > 200){
            contours_rect = boundingRect(contours[i]);
        }
  }//for

6.完成,可查看效果;

关键之处在于:阈值化,需明显隔离出待检测的目标物体和周围环境;

猜你喜欢

转载自blog.csdn.net/sazass/article/details/89633478