OpenCV 轮廓周围绘制矩形框和圆形框的方法

轮廓周围绘制介绍

没什么概念,就是给得出来的轮廓绘制周围图形,例如下图给左侧得出的轮廓去绘图得到右侧图像:

相关API

减少多边形轮廓点数:approxPolyDP

函数作用:基于RDP算法实现,目的是减少多边形轮廓点数

函数原型:

//减少多边形轮廓点数
approxPolyDP(
	InputArray curve, 			// 一般是由图像的轮廓点组成的点集 Mat(vector)
	OutputArray approxCurve, 	// 表示输出的多边形点集
	double epsilon, 			// 主要表示输出的精度,就是两个轮廓点之间最大距离数,5,6,7,,8,,,,
	bool closed 				// 表示输出的多边形是否封闭
)

RDP算法介绍:

  • 判断起始点(当前点)与终点的距离是否小于 epsilon, 若小于,结束,不小于执行2
  • 选取起始点(当前点)A的后两个位置的点C,判断它们之间的距离是否小于 epsilon, 若小于,点C与它们的中间点B都舍弃,若不小于,执行3
  • 判断A与B,B与C的距离,若有一者小于 epsilon,则点B舍弃,否则保留。然后点C作为起始点(当前点)重复 1 2 3 步骤,直到终点(这里得出的是一系列符合要求的点)

轮廓周围绘制矩形:boundingRect、minAreaRect

cv::boundingRect(InputArray points) 得到轮廓周围最小矩形左上交点坐标和右下角点坐标,绘制一个矩形
cv::minAreaRect(InputArray points) 得到一个旋转的矩形,返回旋转矩形

轮廓周围绘制圆和椭圆:minEnclosingCircle、fitEllipse

// 得到轮廓周围最小椭圆
cv::minEnclosingCircle(
InputArray points, 	// 得到最小区域圆形
Point2f& center, 	// 圆心位置 输出参数
float& radius		// 圆的半径 输出参数
)
// 得到轮廓周围最小椭圆
cv::fitEllipse(InputArray points) 

绘制步骤

  • 将图像变为二值图像
  • 发现轮廓,找到图像轮廓
  • 通过相关API在轮廓点上找到最小包含矩形和圆,旋转矩形与椭圆
  • 绘制周围

代码示例

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

using namespace std;
using namespace cv;
Mat src, gray_src, drawImg;
int threshold_v = 170;
int threshold_max = 255;
const char* output_win = "rectangle-demo";
RNG rng(12345);
void Contours_Callback(int, void*);
int main(int argc, char** argv) {
	src = imread("./test2.jpg");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	cvtColor(src, gray_src, CV_BGR2GRAY);
	blur(gray_src, gray_src, Size(3, 3), Point(-1, -1));

	const char* source_win = "input image";
	namedWindow(source_win, CV_WINDOW_AUTOSIZE);
	namedWindow(output_win, CV_WINDOW_AUTOSIZE);
	imshow(source_win, src);
	createTrackbar("Threshold Value:", output_win, &threshold_v, threshold_max, Contours_Callback);
	Contours_Callback(0, 0);
	waitKey(0);
	return 0;
}
void Contours_Callback(int, void*) {
	Mat binary_output;
	vector<vector<Point>> contours;
	vector<Vec4i> hierachy;
	threshold(gray_src, binary_output, threshold_v, threshold_max, THRESH_BINARY);
	imshow("binary image", binary_output);
	findContours(binary_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1));
	vector<vector<Point>> contours_ploy(contours.size());
	vector<Rect> ploy_rects(contours.size());
	vector<Point2f> ccs(contours.size());
	vector<float> radius(contours.size());
	vector<RotatedRect> minRects(contours.size());
	vector<RotatedRect> myellipse(contours.size());
	for (size_t i = 0; i < contours.size(); i++) {
		approxPolyDP(Mat(contours[i]), contours_ploy[i], 3, true);
		ploy_rects[i] = boundingRect(contours_ploy[i]);
		minEnclosingCircle(contours_ploy[i], ccs[i], radius[i]);
		if (contours_ploy[i].size() > 5) {
			myellipse[i] = fitEllipse(contours_ploy[i]);
			minRects[i] = minAreaRect(contours_ploy[i]);
		}
	// draw it
	drawImg = Mat::zeros(src.size(), src.type());
	Point2f pts[4];
	for (size_t t = 0; t < contours.size(); t++) {
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		//rectangle(drawImg, ploy_rects[t], color, 2, 8);
		//circle(drawImg, ccs[t], radius[t], color, 2, 8);
		if (contours_ploy[t].size() > 5) {
			ellipse(drawImg, myellipse[t], color, 1, 8);
			minRects[t].points(pts);
			for (int r = 0; r < 4; r++) {
				line(drawImg, pts[r], pts[(r + 1) % 4], color, 1, 8);
			}
	imshow(output_win, drawImg);
	return;

到此这篇关于OpenCV 轮廓周围绘制矩形框和圆形框的文章就介绍到这了,更多相关OpenCV 绘制矩形框和圆形框内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV实现轮廓检测与绘制

    图像的轮廓不仅能够提供物体的边缘,而且还能提供物体边缘之间的层次关系以及拓扑关系. 带有结构关系的边缘检测,这种结构关系可以表明图像中连通域或者某些区域之间的关系. 图为一个具有4个不连通边缘的二值化图像,由外到内依次为0号.1号.2号.3号条边缘.为了描述不同轮廓之间的结构关系,定义由外到内的轮廓级别越来越低,也就是高一层级的轮廓包围着较低层级的轮廓,被同一个轮廓包围的多个不互相包含的轮廓是同一层级轮廓.例如在图中,0号轮廓层级比1号和第2号轮廓的层及都要高,2号轮廓包围着3号轮廓,因此2号轮

  • opencv提取外部轮廓并在外部加矩形框

    这段时间一直在用opencv搞图像处理的问题,发现虽然可调用的函数多,但是直接找相应代码还是很困难,就行寻找连通域,并在连通域外侧加框,对于习惯使用Mat矩形操作的我,真心感觉代码少之又少,为防止以后自己还会用到,特在此记录一下. 要对下面的图像进行字符的边缘检测. 程序中具体的步骤为: (1)灰度化.二值化 (2)图像膨胀 (3)检测膨胀图像的边缘并叫外矩形框 实现代码如下: #include "stdafx.h" #include "stdio.h" #incl

  • OpenCV图像轮廓的绘制方法

    本文实例为大家分享了检测几何图形轮廓和检测花朵图形轮廓,供大家参考,具体内容如下 OpenCV绘制图像轮廓 绘制轮廓的一般步骤: 1.读取图像 image = cv2.imread('image_path') 2.将原图转化为灰度图像 image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) 3.将灰度图像进行二值化阈值处理 # 这里将阈值设置为127为例,最大阈值为255 t, binary = cv.threshold(image_gray, 12

  • OpenCV 轮廓周围绘制矩形框和圆形框的方法

    轮廓周围绘制介绍 没什么概念,就是给得出来的轮廓绘制周围图形,例如下图给左侧得出的轮廓去绘图得到右侧图像: 相关API 减少多边形轮廓点数:approxPolyDP 函数作用:基于RDP算法实现,目的是减少多边形轮廓点数 函数原型: //减少多边形轮廓点数 approxPolyDP( InputArray curve, // 一般是由图像的轮廓点组成的点集 Mat(vector) OutputArray approxCurve, // 表示输出的多边形点集 double epsilon, //

  • OpenCV轮廓检测之boundingRect绘制矩形边框

    目录 函数原型 参数说明 测试代码 测试效果 补充 函数原型 cv::Rect boundingRect( InputArray array ); 参数说明 输入:InputArray类型的array,输入灰度图像或二维点集. 输出:Rect类型的矩形信息,包括矩形尺寸和位置. 测试代码 #include <iostream> #include <time.h> #include <opencv2/opencv.hpp> using namespace std; usi

  • python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)

    最近学了下 python opencv,分享下使用 opencv 在图片上绘制常用图形的方法. 案例中实现了在图片中添加线段.圆形.矩形.椭圆形以及添加文字的方法,使用 opencv2 实现的. 实现方法 1)画线段 cv.line 在图片中绘制一段直线 # 绘制线段 # 参数1:图片 # 参数2:起点 # 参数3:终点 # 参数4:BGR颜色 # 参数5:宽度 cv2.line(img, (60, 40), (90, 90), (255, 255, 255), 2); 参数说明 参数 值 说明

  • OpenCV鼠标绘制矩形和截取矩形区域图像

    本文实例为大家分享了OpenCV鼠标绘制截取矩形区域图像的具体代码,供大家参考,具体内容如下 在opencv中利用鼠标绘制矩形,代码如下: #include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment( lib, "cv.lib" ) #pragma comment( lib, "cxcore.lib" ) #pragma comment( lib,

  • Python+OpenCV实现在图像上绘制矩形

    话不多说,直接上代码 import copy import cv2 import numpy as np WIN_NAME = 'draw_rect' class Rect(object): def __init__(self): self.tl = (0, 0) self.br = (0, 0) def regularize(self): """ make sure tl = TopLeft point, br = BottomRight point ""

  • opencv绘制矩形和圆的实现

    目录 绘制图形 绘制矩形 绘制圆 绘制图形 利用opencv提供的绘制图形api可以轻松在图像上绘制各种图形,比如直线,矩形,圆,椭圆等图形. line(img,pt1,pt2,color,thickness,lineType,shift)画直线 img:在那个图像上画线 pt1,pt2:开始点,结束点,指定先的开始与结束的位置 color:颜色 thickness:线宽 lineType:线型,线型为-1,4,8,16,默认为8 shift:坐标缩放比例 rectangle()参数同上,画矩形

  • Opencv实现最小外接矩形和圆

    本文实例为大家分享了Opencv实现最小外接矩形和圆的具体代码,供大家参考,具体内容如下 步骤:将一幅图像先转灰度,再canny边缘检测得到二值化边缘图像,再寻找轮廓,轮廓是由一系列点构成的,要想获得轮廓的最小外接矩形,首先需要得到轮廓的近似多边形,用道格拉斯-普克抽稀(DP)算法,道格拉斯-普克抽稀算法,是将曲线近似表示为一系列点,并减少点的数量的一种算法. 该算法实现抽稀的过程是: 1)对曲线的首末点虚连一条直线,求曲线上所有点与直线的距离,并找出最大距离值dmax,用dmax与事先给定的阈

  • C++ opencv实现几何图形绘制

    目录 1.矩形 rectangle() 2. 圆 circle() 3.椭圆 elliple() 在学习过程中,我们可以在图像中绘制一些几何图形,比如矩形,椭圆,线段,填充多边形等,这些函数都挺容易理解,下面简单看一下. 1.矩形 rectangle() 通过对角线上的两个顶点绘制矩形 void rectangle(InputOutputArray img, Rect rec, const Scalar& color, int thickness = 1, int lineType = LINE

  • PyQt5 在label显示的图片中绘制矩形的方法

    在利用QT编写GUI程序时经常需要一些交互操作,常见的有鼠标事件.键盘事件等.今天我们要实现的是在label中已经显示的图像中绘制矩形框,以便进行下一步操作(如放大细节,选中感兴趣区域等)程序主要参考了知乎的小杨老师的专栏. 核心点是重写Label,使其实现相应的功能,看下面的一个小例子 from PyQt5.QtWidgets import QWidget, QApplication, QLabel from PyQt5.QtCore import QRect, Qt from PyQt5.Q

随机推荐