OpenCV画任意圆弧曲线
作者:激萌小宅 发布时间:2023-06-22 19:28:44
标签:OpenCV,画线
逆时针画圆弧,原理:将360度分割成36份,分别标出每10度角度时的坐标点,然后将每个点连接起来。
#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;
// 图像、圆心、开始点、结束点、线宽
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();
// 坐标零点 400,400
Point ZeroPoint = Point(400, 400);
// 起始坐标 150,-100
Point StartPoint = Point(ZeroPoint.x +150, ZeroPoint.y - (-100));
// 结束坐标 -150,-100
Point EndPoint = Point(ZeroPoint.x - 150, ZeroPoint.y - (-100));
// 圆心相对起始点的坐标 -150,200
int I = StartPoint.x - 150;
int J = StartPoint.y - (+200);
Point Arc = Point(I, J);
// 显示圆心坐标
circle(Img, Arc, 5, Scalar(0, 0, 255), -1);
// 显示起始点坐标
circle(Img, StartPoint, 5, Scalar(255, 0, 0), -1);
// 显示结束点坐标
circle(Img, EndPoint, 5, Scalar(0, 255, 0), -1);
// 图像、圆心、开始点、结束点、线宽
DrawArc(&Img, Arc, StartPoint, EndPoint, 2);
imshow("正多边形", Img);
tim = getTickCount() - tim;
printf("处理耗时: %fms\n\n", tim * 1000 / getTickFrequency());
waitKey(0);
return 0;
}
效果如下:
来源:https://blog.csdn.net/gs1069405343/article/details/83414131
0
投稿
猜你喜欢
- Android ListView的Item点击效果的定制
- 说到多渠道,这里不得不提一下友盟统计,友盟统计是大家日常开发中常用的渠道统计工具,而我们的打包方法就是基于友盟统计实施的。按照友盟官方文档说
- 本文实例讲述了C#获取网页源代码的方法。分享给大家供大家参考。具体如下:public string GetPageHTML(string u
- 开发环境win10Android Studio效果用于多级菜单展示,或选择。如 每个省,市,县;如 树木的病虫害;关键代码 @overrid
- 图像滤波在opencv中可以有多种实现形式自定义滤波如使用3×3的掩模:对图像进行处理.使用函数filter2D()实现#include&l
- 本文实例讲述了C#中HttpWebRequest的用法。分享给大家供大家参考。具体如下:HttpWebRequest类主要利用HTTP 协议
- 一、前言在Spring中,事务有两种实现方式:编程式事务管理: 编程式事务管理使用TransactionTemplate可实现更细
- 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,
- 上一节《SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2》我们搭建好了Struts2、Hibe
- 本文实例为大家分享了C#超市收银系统设计的具体代码,供大家参考,具体内容如下1.登录界面代码如下:using System;using Sy
- /// <summary> /// 遍历Co
- 前言前面介绍了APP顶部导航栏AppBar,今天来介绍下Flutter实现APP底部导航栏。我们以仿写微信的底部导航栏来举例说明。要实现类似
- Console.WriteLine("This is a Client, host name is {0}", Dns.
- webp格式图片webp格式图片是google推出的,相比jpg png有着巨大的优势,同样质量的图片webp格式的图片占用空间更小,在像电
- 已知字符串“aabbbcddddeeffffghijklmnopqrst”编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2)/**
- 在观察者模式中有2个要素:一个是被观察对象,另一个是观察者。但被观察对象的状态发生改变会通知观察者。举例:把订阅报纸的人看作是观察者,把报纸
- [LeetCode] 159. Longest Substring with At Most Two Distinct Characters
- 最近没事写了一个简易浏览器,在刚开始写的时候遇到一些问题,主要的问题就是如何在自己的webview中显示所有的网页数据,不过不指
- 最近在看《.NET游戏编程入门经典 C#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。于是写下这篇文章留作纪
- 参考:How to catch an Exception from a threadIs there a way to make Runna