一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - OpenCV繪制圓端矩形的示例代碼

OpenCV繪制圓端矩形的示例代碼

2021-12-26 14:12翟天保Steven Python

本文主要介紹了OpenCV繪制圓端矩形的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文主要介紹了OpenCV繪制圓端矩形的示例代碼,分享給大家,具體如下:

 

功能函數(shù)

// 繪制圓端矩形(藥丸狀,pill)
void DrawPill(cv::Mat mask, const cv::RotatedRect &rotatedrect, const cv::Scalar &color, int thickness, int lineType)
{
	cv::Mat canvas = cv::Mat::zeros(mask.size(), CV_8UC1);
	// 確定短邊,短邊繪制圓形
	cv::RotatedRect rect = rotatedrect;
	float r = rect.size.height / 2.0f;
	if (rect.size.width > rect.size.height) {
		rect.size.width -= rect.size.height;
	}
	else {
		rect.size.height -= rect.size.width;
		r = rect.size.width / 2.0f;
	}
	cv::Point2f ps[4];
	rect.points(ps);
 
	// 繪制邊緣
	std::vector<std::vector<cv::Point>> tmpContours;
	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(canvas, tmpContours, 0, cv::Scalar(255),5, lineType);  // 填充mask
 
	// 計(jì)算常長(zhǎng)短軸
	float a = rotatedrect.size.width;
	float b = rotatedrect.size.height;
 
	int point01_x = (int)((ps[0].x + ps[1].x) / 2.0f);
	int point01_y = (int)((ps[0].y + ps[1].y) / 2.0f);
	int point03_x = (int)((ps[0].x + ps[3].x) / 2.0f);
	int point03_y = (int)((ps[0].y + ps[3].y) / 2.0f);
	int point12_x = (int)((ps[1].x + ps[2].x) / 2.0f);
	int point12_y = (int)((ps[1].y + ps[2].y) / 2.0f);
	int point23_x = (int)((ps[2].x + ps[3].x) / 2.0f);
	int point23_y = (int)((ps[2].y + ps[3].y) / 2.0f);
 
	cv::Point c0 = a < b ? cv::Point(point12_x, point12_y) : cv::Point(point23_x, point23_y);
	cv::Point c1 = a < b ? cv::Point(point03_x, point03_y) : cv::Point(point01_x, point01_y);
 
	// 長(zhǎng)軸兩端以填充的方式畫(huà)圓,直徑等于短軸
	cv::circle(canvas, c0, (int)r, cv::Scalar(255), 5, lineType);
	cv::circle(canvas, c1, (int)r, cv::Scalar(255), 5, lineType);
 
	// 繪制外圍輪廓,如果不這樣操作,會(huì)得到一個(gè)矩形加兩個(gè)圓形,丑。。。
	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
}

 

測(cè)試代碼

#include <iostream>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
void DrawPill(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(1000, 800), 50);
	DrawPill(result, rorect, cv::Scalar(0, 255, 255),8,16);
	imshow("original", src);
	imshow("result", result);
	waitKey(0);
	return 0;
}
 
// 繪制圓端矩形(藥丸狀,pill)
void DrawPill(cv::Mat mask, const cv::RotatedRect &rotatedrect, const cv::Scalar &color, int thickness, int lineType)
{
	cv::Mat canvas = cv::Mat::zeros(mask.size(), CV_8UC1);
	// 確定短邊,短邊繪制圓形
	cv::RotatedRect rect = rotatedrect;
	float r = rect.size.height / 2.0f;
	if (rect.size.width > rect.size.height) {
		rect.size.width -= rect.size.height;
	}
	else {
		rect.size.height -= rect.size.width;
		r = rect.size.width / 2.0f;
	}
	cv::Point2f ps[4];
	rect.points(ps);
 
	// 繪制邊緣
	std::vector<std::vector<cv::Point>> tmpContours;
	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(canvas, tmpContours, 0, cv::Scalar(255),5, lineType);  // 填充mask
 
	// 計(jì)算常長(zhǎng)短軸
	float a = rotatedrect.size.width;
	float b = rotatedrect.size.height;
 
	int point01_x = (int)((ps[0].x + ps[1].x) / 2.0f);
	int point01_y = (int)((ps[0].y + ps[1].y) / 2.0f);
	int point03_x = (int)((ps[0].x + ps[3].x) / 2.0f);
	int point03_y = (int)((ps[0].y + ps[3].y) / 2.0f);
	int point12_x = (int)((ps[1].x + ps[2].x) / 2.0f);
	int point12_y = (int)((ps[1].y + ps[2].y) / 2.0f);
	int point23_x = (int)((ps[2].x + ps[3].x) / 2.0f);
	int point23_y = (int)((ps[2].y + ps[3].y) / 2.0f);
 
	cv::Point c0 = a < b ? cv::Point(point12_x, point12_y) : cv::Point(point23_x, point23_y);
	cv::Point c1 = a < b ? cv::Point(point03_x, point03_y) : cv::Point(point01_x, point01_y);
 
	// 長(zhǎng)軸兩端以填充的方式畫(huà)圓,直徑等于短軸
	cv::circle(canvas, c0, (int)r, cv::Scalar(255), 5, lineType);
	cv::circle(canvas, c1, (int)r, cv::Scalar(255), 5, lineType);
 
	// 繪制外圍輪廓,如果不這樣操作,會(huì)得到一個(gè)矩形加兩個(gè)圓形,丑。。。
	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
}

 

測(cè)試效果

OpenCV繪制圓端矩形的示例代碼

圖1 原圖

OpenCV繪制圓端矩形的示例代碼

圖2 繪制圓端矩形

繪制圓端矩形其實(shí)就是繪制了一個(gè)旋轉(zhuǎn)矩形,然后分析哪個(gè)軸更長(zhǎng),就在哪個(gè)軸上的兩端畫(huà)圓,再取外圍輪廓,大功告成,通俗來(lái)講就畫(huà)了一個(gè)矩形兩個(gè)圓,如圖3所示。

OpenCV繪制圓端矩形的示例代碼

圖3 繪制邏輯

不過(guò)注意,這個(gè)圖形最好不要超過(guò)圖像邊界,因?yàn)槌^(guò)后再分析外圍輪廓,它認(rèn)為的外圍就到了內(nèi)部,如圖4所示。

OpenCV繪制圓端矩形的示例代碼

圖4 外圍線(xiàn)

然后,你就會(huì)得到一個(gè)奇葩圖形,如圖5所示。

OpenCV繪制圓端矩形的示例代碼

圖5 示意圖

到此這篇關(guān)于OpenCV繪制圓端矩形的示例代碼的文章就介紹到這了,更多相關(guān)OpenCV 圓端矩形內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/zhaitianbao/article/details/119945580

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 五月天精品视频在线观看 | 国产成人无精品久久久 | 日本福利片国产午夜久久 | 性欧美高清理论片 | 午夜爱爱片 | 成人影院在线观看视频 | 秋葵丝瓜茄子草莓榴莲樱桃 | 特级av毛片免费观看 | 精品日韩视频 | 国产精品久久久久久久久免费hd | 爱草影院| 三级黄色片在线观看 | kayden·kross hd在线 | 国产高清在线播放免费观看 | 日韩激情视频在线观看 | 女人麻豆国产香蕉久久精品 | 亚洲网色 | 日本中文字幕在线观看视频 | 俄罗斯大白屁股 | 波多野结衣伦理在线观看 | 98pao强力打造高清免费 | 免费的强动漫人物 | sss亚洲国产欧美一区二区 | 欧洲vodafone精品性 | 俄罗斯女同和女同xx | 日日夜夜撸影院 | 四虎成人永久地址 | 日本漫画大全之工之口 | 91精品国产综合久 | 四虎影院大全 | 精品国产日韩亚洲一区在线 | 日韩免费视频一区 | 男同gay玩奴男同玩奴 | 三级aa久久 | 能看的毛片网站 | 欧美va免费精品高清在线 | 国产丰满美女做爰 | 亚洲伦理一区 | 毛片在线免费观看网站 | 香蕉精品视频 | 欧美福利二区 |