使用c 實現OpenCV繪製圓端矩形

2022-09-29 12:09:09 字數 3826 閱讀 9974

// 繪製圓端矩形(藥丸狀,pill)

void drawpill(cv::mat mask, const cv::rotatedrect &rotatedrect, const cv::scalar &color, int thickness, int linetype)

else

cv::point2f ps[4];

rect.points(ps);

// 繪製邊緣

std::vector<:vector>> tmpcontours;

std::vector<:point> contours;

for (int i = 0; i != 4; ++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)((drmbhyips[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.0程式設計客棧f);

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<:vector>> excontours;

cv::findcontours(canvas,excontours,cv::retr_ex程式設計客棧ternal, chain_approx_******);

drawcontours(mask, excontours, 0, color, thickness,linetype); // 填充mask

}#include

#include

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()

// 繪製圓端矩形(藥丸狀,pill)

void drawpill(cv::mat mask, const cv::rotatedrect &rotatedrect, const cv::scalar &color, int thickness, int linetype)

else

cv::point2f ps[4];

rect.points(ps);

// 繪製邊緣

std::vector<:vector>> tmpcontours;

std::vector<:point> contours;

for (int i = 0; i != 4; ++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].xdrmbhyi + 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<:vector>> excontours;

cv::findcontours(canvas,excontours,cv::retr_external, chain_approx_******);

drawcontours(mask, excontours, 0, color, thickness,linetype); // 填充mask

}圖1 原圖

圖2 繪製圓端矩形

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

圖3 繪製邏

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

圖4 外圍線

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

圖5 示意圖

OpenCV中繪製外圍矩形框和圓框

利用邊界尋找函式找到的邊界座標資訊。然後利用每一條尋找到的邊際資訊去找到圖形的矩形邊界和圓形邊界。根據已知的邊界資訊點。將邊界資訊傳入提供的api函式得到該邊界的矩形框。api rect boundingrect mat 輸入點集 下面是具體的使用方法 void rec int,void out p...

Opencv實現最小外接矩形和圓

步驟 將一幅影象先轉灰度,再canny邊緣檢測得到二值化邊緣影象,再尋找輪廓,輪廓是由一系列點構成的,要想獲得輪廓的最小外接矩形,首先需要得到輪廓的近似多邊形,用程式設計客棧道格拉斯 普克抽稀 dp 演算法,道格拉斯 普克抽稀演算法,是將曲線近似表示為一系列點,並減少點的數量的一種演算法。該演算法實...

使用canvas繪製乙個圓或者圓弧

arc x,y,radius,startangle,endangle,anticlockwise 畫乙個以 x,y 為圓心的以radius為半徑的圓弧 圓 從startangle開始到endangle結束,按照anticlockwise給定的方向 預設為順時針 來生成。arc 函式中表示角的單位是弧...