看到了 @冰不語 有一個時鐘例子,看起來挺酷炫的,馬上實現了下。
先畫一個總體的輪廓。
先看效果:
Talk is cheap,show you the code.
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
int main()
{
Mat clock_background(500, 500, CV_8UC3, Scalar::all(0));//創一個背景
int radius = clock_background.cols / 2;//設半徑
Point center(clock_background.cols / 2, clock_background.rows / 2);//設圓心
circle(clock_background, center, radius, Scalar(255, 100, 0), 1, 8, 0);//畫時鐘外輪廓
circle(clock_background, center, 5, Scalar(0, 0, 255), -1, 8, 0);//畫圓心
Point second_begin, second_end;//設刻度的起點,終點
int scale_long = 10;//刻度的長度
int scale_width = 2;//刻度的寬度
//畫一個背景
for (int second_Scale = 0; second_Scale < 60; second_Scale++)
{
if (second_Scale % 5 == 0)//每五個刻度就變長度,也就是整點1,2,3,···,12這些數字對應的刻度長一點
{
scale_long = 20;
scale_width = 5;
}
else
{
scale_long = 10;
scale_width = 2;
}
second_begin.x = center.x + radius * cos(6 * second_Scale* CV_PI / 180);//刻度的起點x座標賦值
second_begin.y = center.y + radius * sin(6 * second_Scale* CV_PI / 180);//刻度的起點y座標賦值
second_end.x = center.x + (radius - scale_long) * cos(6 * second_Scale* CV_PI / 180);//刻度的終點x座標賦值
second_end.y = center.y + (radius - scale_long) * sin(6 * second_Scale* CV_PI / 180);//刻度的終點y座標賦值
line(clock_background, second_begin, second_end, Scalar(50, 205, 50), scale_width);//連接起點終點
}
imshow("clock", clock_background);
waitKey(0);
return 0;
}
我畫時鐘第一步就是先把整體的輪廓畫出來。
步驟:
- 第一步:畫一個外輪廓,這個很簡單,確定圓心,半徑,就可以畫出。
- 第二步:把刻度給畫出來,這一步就相對有點思考,不過其實也很簡單。
首先,明確OpenCV中的座標原點是在圖片的左上角,那麼,我們畫的圓的原點也就相當於(center.x,center.y)
然後如果找圓上一點,怎麼找呢?是不是可以通過
center.x + radius * cos(6 * second_Scale * CV__PI / 180)
因爲每個刻度相隔6°,所以要找每隔6°的x座標,y座標同理。
至此,總體畫出來了。