濮阳杆衣贸易有限公司

主頁 > 知識庫 > OpenCV繪制圓角矩形的方法實例

OpenCV繪制圓角矩形的方法實例

熱門標簽:地圖標注多個 鶴壁手機自動外呼系統(tǒng)違法嗎 B52系統(tǒng)電梯外呼顯示E7 怎么辦理400客服電話 萊蕪電信外呼系統(tǒng) 銀川電話機器人電話 企業(yè)微信地圖標注 高德地圖標注收入咋樣 沈陽防封電銷電話卡

功能函數(shù)

// 繪制圓角矩形
void DrawRotatedRectChamfer(cv::Mat mask,const cv::RotatedRect rotatedrect, float radius,const cv::Scalar color, int thickness, int lineType)
{
	// 創(chuàng)建畫布
	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::vectorstd::vectorcv::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::vectorstd::vectorcv::Point>> tmpContours;    // 創(chuàng)建一個InputArrayOfArrays 類型的點集
	std::vectorcv::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)
{
	// 創(chuàng)建畫布
	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::vectorstd::vectorcv::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::vectorstd::vectorcv::Point>> tmpContours;    // 創(chuàng)建一個InputArrayOfArrays 類型的點集
	std::vectorcv::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 繪制邏輯

同理,這個最好不要繪制到圖像外面,否則它在分析外圍線的時候會出錯,可以多加些判斷來修正,我就不寫了,交給兄弟們研究一下~

總結

到此這篇關于OpenCV繪制圓角矩形的文章就介紹到這了,更多相關OpenCV繪制圓角矩形內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Opencv繪制最小外接矩形、最小外接圓
  • OpenCV鼠標繪制矩形和截取矩形區(qū)域圖像
  • python opencv常用圖形繪制方法(線段、矩形、圓形、橢圓、文本)

標簽:葫蘆島 三亞 湘西 銀川 呼倫貝爾 烏魯木齊 安慶 呼倫貝爾

巨人網(wǎng)絡通訊聲明:本文標題《OpenCV繪制圓角矩形的方法實例》,本文關鍵詞  OpenCV,繪制,圓角,矩,形的,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《OpenCV繪制圓角矩形的方法實例》相關的同類信息!
  • 本頁收集關于OpenCV繪制圓角矩形的方法實例的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    五河县| 万年县| 永善县| 澄城县| 大名县| 南汇区| 鄂伦春自治旗| 琼结县| 夏河县| 广东省| 泉州市| 馆陶县| 拉孜县| 新巴尔虎右旗| 南京市| 高青县| 霸州市| 老河口市| 隆德县| 长兴县| 沈丘县| 晋中市| 且末县| 河北区| 和政县| 油尖旺区| 北安市| 固安县| 连城县| 武夷山市| 苏州市| 阿尔山市| 兰溪市| 曲阳县| 黎城县| 石阡县| 盘锦市| 旬阳县| 湖州市| 铅山县| 汝阳县|