OpenCV中绘制外围矩形框和圆框

OpenCV中绘制外围矩形框和圆框

利用边界寻找函数找到的边界坐标信息。然后利用每一条寻找到的边际信息去找到图形的矩形边界和圆形边界。

一、 OpenCV中绘制外围矩形框

根据已知的边界信息点。将边界信息传入提供的API函数得到该边界的矩形框。

API:Rect boundingRect(Mat(输入点集));

下面是具体的使用方法:

void rec(int,void*)
{
  Mat out_put;
  vector<vector<Point>> contours;
  vector<Vec4i> hierarchy;
  
  Canny(src_gray,dst,thres,2*thres);
  
  findContours(dst,contours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
  
  vector<Rect> rect_size(contours.size());
  vector<Point2f> circle_p(contours.size());
  vector<float> circle_r(contours.size());
  for(int  i = 0;i < contours.size();i++)
  {
    rect_size[i] = boundingRect(Mat(contours[i]));
  }
  out_put = Mat::zeros(src.size(),CV_8UC3);
  for(int i = 0;i < rect_size.size();i++)
  {
    rectangle(out_put,rect_size[i],Scalar(0,255,0),2,8);
  }
  imshow("out_put",out_put);
}

OpenCV中绘制外围圆形框

根据已经知道的边界信息点,得到圆形框的圆心(存储类型vector)和半径(存储类型vector)。

minEnclosingCircle(
	Mat(输入点集),
	Point2f& 圆心,
	float& 半径,
);

具体的使用方法如下:

void rec(int,void*)
{
  Mat out_put;
  vector<vector<Point>> contours;
  vector<Vec4i> hierarchy;
  
  Canny(src_gray,dst,thres,2*thres);
  
  findContours(dst,contours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
  
  vector<Rect> rect_size(contours.size());
  vector<Point2f> circle_p(contours.size());
  vector<float> circle_r(contours.size());
  for(int  i = 0;i < contours.size();i++)
  {
    rect_size[i] = boundingRect(Mat(contours[i]));
    minEnclosingCircle(Mat(contours[i]),circle_p[i],circle_r[i]);
  }
  out_put = Mat::zeros(src.size(),CV_8UC3);
  for(int i = 0;i < rect_size.size();i++)
  {
//     rectangle(out_put,rect_size[i],Scalar(0,255,0),2,8);
    circle(out_put,circle_p[i],circle_r[i],Scalar(0,0,255),2,8);
  }
  imshow("out_put",out_put);
}

全部的代码如下:


#include "opencv2/highgui/highgui_c.h"
#include "opencv2/opencv.hpp"
#include<iostream>

using namespace std;
using namespace cv;


Mat src,src_gray,dst;

int thres = 100;
void rec(int,void*);

int main()
{
  src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/map.png");
  
  cvtColor(src,src_gray,COLOR_BGR2GRAY);
  blur(src_gray,src_gray,Size(3,3));
  imshow("src_gray",src_gray);
  
  namedWindow("test",CV_WINDOW_AUTOSIZE);
  createTrackbar("value","test",&thres,255,rec);
  rec(0,0);
  
  waitKey(0);
  return 0;
}

void rec(int,void*)
{
  Mat out_put;
  vector<vector<Point>> contours;
  vector<Vec4i> hierarchy;
  
  Canny(src_gray,dst,thres,2*thres);
  
  findContours(dst,contours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
  
  vector<Rect> rect_size(contours.size());
  vector<Point2f> circle_p(contours.size());
  vector<float> circle_r(contours.size());
  for(int  i = 0;i < contours.size();i++)
  {
    rect_size[i] = boundingRect(Mat(contours[i]));
    minEnclosingCircle(Mat(contours[i]),circle_p[i],circle_r[i]);
  }
  out_put = Mat::zeros(src.size(),CV_8UC3);
  for(int i = 0;i < rect_size.size();i++)
  {
//     rectangle(out_put,rect_size[i],Scalar(0,255,0),2,8);
    circle(out_put,circle_p[i],circle_r[i],Scalar(0,0,255),2,8);
  }
  imshow("out_put",out_put);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值