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

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

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

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

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

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

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

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

 

功能函數

// 繪制圓端矩形(藥丸狀,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
 
	// 計算常長短軸
	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);
 
	// 長軸兩端以填充的方式畫圓,直徑等于短軸
	cv::circle(canvas, c0, (int)r, cv::Scalar(255), 5, lineType);
	cv::circle(canvas, c1, (int)r, cv::Scalar(255), 5, lineType);
 
	// 繪制外圍輪廓,如果不這樣操作,會得到一個矩形加兩個圓形,丑。。。
	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
}

 

測試代碼

#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
 
	// 計算常長短軸
	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);
 
	// 長軸兩端以填充的方式畫圓,直徑等于短軸
	cv::circle(canvas, c0, (int)r, cv::Scalar(255), 5, lineType);
	cv::circle(canvas, c1, (int)r, cv::Scalar(255), 5, lineType);
 
	// 繪制外圍輪廓,如果不這樣操作,會得到一個矩形加兩個圓形,丑。。。
	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
}

 

測試效果

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

圖1 原圖

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

圖2 繪制圓端矩形

繪制圓端矩形其實就是繪制了一個旋轉矩形,然后分析哪個軸更長,就在哪個軸上的兩端畫圓,再取外圍輪廓,大功告成,通俗來講就畫了一個矩形兩個圓,如圖3所示。

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

圖3 繪制邏輯

不過注意,這個圖形最好不要超過圖像邊界,因為超過后再分析外圍輪廓,它認為的外圍就到了內部,如圖4所示。

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

圖4 外圍線

然后,你就會得到一個奇葩圖形,如圖5所示。

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

圖5 示意圖

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男女精品视频 | 五月性 | 大象传媒1234区 | 成人福利在线视频免费观看 | 俄罗斯男男激情1069gay | 欧美一级特黄aaa大片 | 九九精品国产兔费观看久久 | 国产日韩综合 | 成人在线视频国产 | 国产精品女主播自在线拍 | 国产一区在线免费观看 | avtt在线观看 | 狠狠狠地啪香蕉 | 美女口述又粗又大感觉 | 精品国产成人高清在线 | 成人国产第一区在线观看 | 性色香蕉AV久久久天天网 | 亚洲 日韩经典 中文字幕 | h版小说 | 日韩aⅴ在线观看 | 男人天堂资源网 | 91肥熟国产老肥熟在线 | 久久99国产精品二区不卡 | 啊啊啊好大视频 | 日本福利视频一区 | 嫩草研究 | 调教催眠改造np总攻 | 国产伦久视频免费观看视频 | 日韩在线天堂免费观看 | 国产精品啪啪 | 成年人在线视频免费观看 | a级免费在线观看 | 无码一区国产欧美在线资源 | 欧美同性gayvidoes | 亚洲国产剧情中文视频在线 | 女女宿舍互慰h文小说 | 人人爱天天做夜夜爽88 | 日韩视频一区二区三区 | 日韩欧美亚洲一区二区综合 | 国产激情久久久久影院小草 | yin娃sao货调教情趣用品店 |