opencv-绘制圆角矩形(代码片段)

翟天保Steven 翟天保Steven     2022-12-27     190

关键词:

功能函数

// 绘制圆角矩形
void DrawRotatedRectChamfer(cv::Mat mask,const cv::RotatedRect rotatedrect, float radius,const cv::Scalar &color, int thickness, int lineType)

	// 创建画布
	cv::Mat canvas = cv::Mat::zeros(mask.size(), CV_8UC1);

	cv::RotatedRect newrotatedrect = rotatedrect;

	//画宽缩减后的矩形
	cv::RotatedRect r1 = newrotatedrect;
	r1.size.width = r1.size.width - 2 * radius;
	DrawRotatedRect(canvas, r1, cv::Scalar(255), 5, lineType);

	//画高缩减后的矩形
	cv::RotatedRect r2 = newrotatedrect;
	r2.size.height = r2.size.height - 2 * radius;
	DrawRotatedRect(canvas, r2, cv::Scalar(255), 5,lineType);

	//画四个角的圆
	cv::RotatedRect r3 = r2;
	r3.size.width = r1.size.width;

	cv::Point2f ps[4];
	r3.points(ps);

	for (int i = 0; i != 4; ++i) 
		cv::circle(canvas, ps[i], (int)radius, cv::Scalar(255), 5);
	
	std::vector<std::vector<cv::Point>> EXcontours;
	cv::findContours(canvas, EXcontours, cv::RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	drawContours(mask, EXcontours, 0, color, thickness, lineType);  // 填充mask



// 绘制旋转矩形
void DrawRotatedRect(cv::Mat mask,const cv::RotatedRect rotatedrect,const cv::Scalar &color, int thickness,int lineType)

	cv::Point2f ps[4];
	rotatedrect.points(ps);

	std::vector<std::vector<cv::Point>> tmpContours;    // 创建一个InputArrayOfArrays 类型的点集
	std::vector<cv::Point> contours;
	for (int i = 0; i != 4; ++i) 
		contours.emplace_back(cv::Point2i(ps[i]));
	
	tmpContours.insert(tmpContours.end(), contours);
	drawContours(mask, tmpContours, 0, color, thickness, lineType);  // 填充mask

测试代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;

void DrawRotatedRectChamfer(cv::Mat mask, const cv::RotatedRect rotatedrect, float radius, const cv::Scalar &color, int thickness, int lineType);
void DrawRotatedRect(cv::Mat mask, const cv::RotatedRect rotatedrect, const cv::Scalar &color, int thickness, int lineType);

int main()

	cv::Mat src = imread("test.jpg");
	cv::Mat result = src.clone();
	cv::RotatedRect rorect(cv::Point(src.cols / 2, src.rows / 2), cv::Size(800, 600), 50);
	DrawRotatedRectChamfer(result, rorect, 100, cv::Scalar(0, 0, 255), 5, 16);
	imshow("original", src);
	imshow("result", result);
	waitKey(0);
	return 0;


// 绘制圆角矩形
void DrawRotatedRectChamfer(cv::Mat mask,const cv::RotatedRect rotatedrect, float radius,const cv::Scalar &color, int thickness, int lineType)

	// 创建画布
	cv::Mat canvas = cv::Mat::zeros(mask.size(), CV_8UC1);

	cv::RotatedRect newrotatedrect = rotatedrect;

	//画宽缩减后的矩形
	cv::RotatedRect r1 = newrotatedrect;
	r1.size.width = r1.size.width - 2 * radius;
	DrawRotatedRect(canvas, r1, cv::Scalar(255), 5, lineType);

	//画高缩减后的矩形
	cv::RotatedRect r2 = newrotatedrect;
	r2.size.height = r2.size.height - 2 * radius;
	DrawRotatedRect(canvas, r2, cv::Scalar(255), 5,lineType);

	//画四个角的圆
	cv::RotatedRect r3 = r2;
	r3.size.width = r1.size.width;

	cv::Point2f ps[4];
	r3.points(ps);

	for (int i = 0; i != 4; ++i) 
		cv::circle(canvas, ps[i], (int)radius, cv::Scalar(255), 5);
	
	std::vector<std::vector<cv::Point>> EXcontours;
	cv::findContours(canvas, EXcontours, cv::RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	drawContours(mask, EXcontours, 0, color, thickness, lineType);  // 填充mask



// 绘制旋转矩形
void DrawRotatedRect(cv::Mat mask,const cv::RotatedRect rotatedrect,const cv::Scalar &color, int thickness,int lineType)

	cv::Point2f ps[4];
	rotatedrect.points(ps);

	std::vector<std::vector<cv::Point>> tmpContours;    // 创建一个InputArrayOfArrays 类型的点集
	std::vector<cv::Point> contours;
	for (int i = 0; i != 4; ++i) 
		contours.emplace_back(cv::Point2i(ps[i]));
	
	tmpContours.insert(tmpContours.end(), contours);
	drawContours(mask, tmpContours, 0, color, thickness, lineType);  // 填充mask

测试效果 

图1 原图
图2 绘制圆角矩形

       绘制圆角矩形其实是绘制了两个旋转矩形,交叉组合,然后以四交点为圆心绘制圆,就组成了圆角矩形,如图3所示。

图3 绘制逻辑

       同理,这个最好不要绘制到图像外面,否则它在分析外围线的时候会出错,可以多加些判断来修正,我就不写了,交给兄弟们研究一下~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

canvas绘制圆形图片绘制圆角矩形图片?(代码片段)

前言在Canvas中我们常常遇到的一个需求绘制一个圆形或者一个圆角矩形图像,常用于展示用户头像,我们知道CSS有border-radius属性,但是Canvas是没有的~?? 很尴尬,我们就来瞅瞅怎么整出一个圆形头像~Part.1 效果圆形头像&nbs... 查看详情

以编程方式绘制圆角矩形[重复](代码片段)

...rectangleinCoreGraphics/Quartz2D?我想以编程方式为我覆盖的UIView绘制一个圆角矩形,我该怎么做?答案NSBezierPath有一个特殊的+bezierPathWithRoundedRect:xRadius:yRadius:,请查看文档。NSBezierPath*path=[NSBezierPathbezierPathWithRoundedRect:NSMakeRect(...)xRadius:... 查看详情

actionscript3绘制圆角矩形,您可以在其中定义每个角(代码片段)

查看详情

opencv-绘制旋转矩形(代码片段)

功能函数//绘制旋转矩形voidDrawRotatedRect(cv::Matmask,constcv::RotatedRect&rotatedrect,constcv::Scalar&color,intthickness,intlineType)//提取旋转矩形的四个角点 cv::Point2fps[4]; rotatedrect.points(ps);//构建轮廓线 std: 查看详情

opencv例程200篇211.绘制垂直矩形(代码片段)

OpenCV例程200篇总目录【youcans的OpenCV例程200篇】211.绘制垂直矩形7.1绘图函数基本参数OpenCV提供了绘图功能,可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。函数cv.line()、cv.rectangle()、cv.circle()、cv.polylines()等分别用... 查看详情

opencv例程200篇211.绘制垂直矩形(代码片段)

OpenCV例程200篇总目录【youcans的OpenCV例程200篇】211.绘制垂直矩形7.1绘图函数基本参数OpenCV提供了绘图功能,可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。函数cv.line()、cv.rectangle()、cv.circle()、cv.polylines()等分别用... 查看详情

opencv例程200篇212.绘制倾斜的矩形(代码片段)

OpenCV例程200篇总目录【youcans的OpenCV例程200篇】212.绘制倾斜的矩形7.1绘图函数基本参数OpenCV提供了绘图功能,可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。函数原型:函数cv.rectangle()用来在图像上绘制垂直于... 查看详情

opencv-绘制圆端矩形(药丸)(代码片段)

功能函数//绘制圆端矩形(药丸状,pill)voidDrawPill(cv::Matmask,constcv::RotatedRect&rotatedrect,constcv::Scalar&color,intthickness,intlineType) cv::Matcanvas=cv::Mat::zeros(mask.size 查看详情

opencv轮廓周围绘制矩形框和圆形框(代码片段)

文章目录轮廓周围绘制介绍相关API减少多边形轮廓点数:approxPolyDP轮廓周围绘制矩形:boundingRect、minAreaRect轮廓周围绘制圆和椭圆:minEnclosingCircle、fitEllipse绘制步骤代码示例轮廓周围绘制介绍没什么概念,就是给... 查看详情

opencv-基本图形绘制(圆矩形椭圆)(代码片段)

circle函数原型voidcircle(InputOutputArrayimg,Pointcenter,intradius,constScalar&color,intthickness=1,intlineType=LINE_8,intshift=0);circle参数说明InputOutputArray类型的img,输入图像也是输出图像, 查看详情

如何快速绘制简单的圆角矩形(圆角)

】如何快速绘制简单的圆角矩形(圆角)【英文标题】:Howtodrawasimpleroundedrectinswift(roundedcorners)【发布时间】:2015-05-2108:47:03【问题描述】:我设法画了一个矩形:-)但我不知道如何画一个圆角矩形。有人可以帮我用下面的代码如... 查看详情

opencv各种绘制调用:线,矩形,圆,椭圆,文字(代码片段)

OpenCV提供了各种绘制接口,可以往图片里画各种东西,这种功能可以为以后在图像上标记一些信息方便调试 //drawcall.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include"opencv2/opencv.hpp"intmain()cv::Matimg(cv::Size(400,300),CV_8UC3);/... 查看详情

在python中的opencv中绘制一个旋转的框(代码片段)

...方框。以及角度。但我似乎无法弄清楚如何在Python中使用OpenCV绘制旋转的矩形。请注意,我不想旋转图像。谢谢答案在OpenCV中绘制矩形的方法有很多种。从OpenCV文档:qazxswpoi长方形绘制一个简单,厚实或填充右上方的矩形。所以... 查看详情

opencv学习-物体轮廓外接矩形的绘制(代码片段)

全部代码-单个物体注意以下代码与对多个物体进行框选的代码的不同。#include<opencv2/opencv.hpp>#include<iostream>usingnamespacestd;usingnamespacecv;intmain() Matsrc,Gau_src,gray_src,binary_src; src=imread("D:/image 查看详情

python,opencv鼠标事件进行矩形圆形的绘制(随机颜色随机半径)(代码片段)

Python,OpenCV鼠标事件进行矩形、圆形的绘制(随机颜色、随机半径)1.效果图2.源码参考这篇博客将介绍鼠标事件,并介绍鼠标事件矩形、圆形的绘制;所有的鼠标事件(左键按下、左键释放、右键按下、... 查看详情

绘制圆角矩形的透明度问题

】绘制圆角矩形的透明度问题【英文标题】:Transparencyissuesdrawingarectanglewithroundedcorners【发布时间】:2018-02-1410:13:42【问题描述】:我正在尝试使用我在教程中找到的一些代码绘制圆角矩形,并由我稍作修改:#Roundedrectanglealgorith... 查看详情

androidui绘制圆角矩形进度条①(像素值转化dp->px|paint标志位设置|paint画笔线帽样式设置|paint画笔线段连接处样式设置)(代码片段)

文章目录一、绘制圆角矩形进度条二、像素值转化dp->px三、Paint标志位设置四、Paint画笔线帽样式设置五、Paint画笔线段连接处样式设置PathMeasure官方文档:https://developer.android.google.cn/reference/kotlin/android/graphics/PathMeasure一、绘制圆... 查看详情

26opencv入门轮廓查找与绘制——正外接矩形(代码片段)

一、简介1、使用特定形状的轮廓包围  在实际应用中,经常会有将检测到的轮廓用多边形表示出来的需求,提取包围轮廓的多边形也方便我们做进一步分析,轮廓包围主要有一下几种:轮廓外接矩形、轮廓最小外接矩形(旋转)、轮... 查看详情