OpenCV畫任意圓弧曲線
更新時間:2020年08月19日 15:48:10 作者:激萌小宅
這篇文章主要為大家詳細介紹了OpenCV畫任意圓弧曲線,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
逆時針畫圓弧,原理:將360度分割成36份,分別標(biāo)出每10度角度時的坐標(biāo)點,然后將每個點連接起來。
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\contrib\contrib.hpp>
#include <fstream>
#include <windows.h>
using namespace cv;
using namespace std;
// 圖像、圓心、開始點、結(jié)束點、線寬
void DrawArc(Mat *src, Point ArcCenter, Point StartPoint, Point EndPoint, int Fill)
{
if (Fill <= 0) return;
vector<Point> Dots;
double Angle1 = atan2((StartPoint.y - ArcCenter.y), (StartPoint.x - ArcCenter.x));
double Angle2 = atan2((EndPoint.y - ArcCenter.y), (EndPoint.x - ArcCenter.x));
double Angle = Angle1 - Angle2;
Angle = Angle * 180.0 / CV_PI;
if (Angle < 0) Angle = 360 + Angle;
if (Angle == 0) Angle = 360;
int brim = floor(Angle / 10); // 向下取整
Dots.push_back(StartPoint);
for (int i = 0; i < brim; i++)
{
double dSinRot = sin(-(10 * (i + 1)) * CV_PI / 180);
double dCosRot = cos(-(10 * (i + 1)) * CV_PI / 180);
int x = ArcCenter.x + dCosRot * (StartPoint.x - ArcCenter.x) - dSinRot * (StartPoint.y - ArcCenter.y);
int y = ArcCenter.y + dSinRot * (StartPoint.x - ArcCenter.x) + dCosRot * (StartPoint.y - ArcCenter.y);
Dots.push_back(Point(x, y));
}
Dots.push_back(EndPoint);
RNG &rng = theRNG();
Scalar color = Scalar(rng.uniform(100, 255), rng.uniform(100, 255), rng.uniform(100, 255));
for (int i = 0; i < Dots.size() - 1; i++) {
line(*src, Dots[i], Dots[i + 1], color, Fill);
}
Dots.clear();
}
int main()
{
Mat Img = Mat::zeros(800, 800, CV_8UC3);
int64 tim = getTickCount();
// 坐標(biāo)零點 400,400
Point ZeroPoint = Point(400, 400);
// 起始坐標(biāo) 150,-100
Point StartPoint = Point(ZeroPoint.x +150, ZeroPoint.y - (-100));
// 結(jié)束坐標(biāo) -150,-100
Point EndPoint = Point(ZeroPoint.x - 150, ZeroPoint.y - (-100));
// 圓心相對起始點的坐標(biāo) -150,200
int I = StartPoint.x - 150;
int J = StartPoint.y - (+200);
Point Arc = Point(I, J);
// 顯示圓心坐標(biāo)
circle(Img, Arc, 5, Scalar(0, 0, 255), -1);
// 顯示起始點坐標(biāo)
circle(Img, StartPoint, 5, Scalar(255, 0, 0), -1);
// 顯示結(jié)束點坐標(biāo)
circle(Img, EndPoint, 5, Scalar(0, 255, 0), -1);
// 圖像、圓心、開始點、結(jié)束點、線寬
DrawArc(&Img, Arc, StartPoint, EndPoint, 2);
imshow("正多邊形", Img);
tim = getTickCount() - tim;
printf("處理耗時: %fms\n\n", tim * 1000 / getTickFrequency());
waitKey(0);
return 0;
}
效果如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C語言 三大循環(huán) 四大跳轉(zhuǎn) 和判斷語句
這篇文章主要介紹了詳解C語言 三大循環(huán) 四大跳轉(zhuǎn) 和判斷語句的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07
C++中的頭文件與Extern(外部函數(shù)調(diào)用)方式
這篇文章主要介紹了C++中的頭文件與Extern(外部函數(shù)調(diào)用)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
win10環(huán)境下C++ vs2015編譯opencv249的教程
這篇文章主要介紹了win10環(huán)境下C++ vs2015編譯opencv249的教程,本文分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Qt使用QCamera實現(xiàn)切換相機,分辨率和圖像捕獲功能
這篇文章主要為大家介紹了如何利用Qt中的相機類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture實現(xiàn)切換相機、分辨率和圖像捕獲功能,需要的可以了解一下2023-04-04
解析如何在C語言中調(diào)用shell命令的實現(xiàn)方法
本篇文章是對如何在C語言中調(diào)用shell命令的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05

