一、什么是OpenCV circle函数
OpenCV是一个基于BSD许可(开源)发行的跨平台的计算机视觉库,包含了非常多的图像处理和计算机视觉算法。OpenCV circle函数是OpenCV库中用来绘制圆形的函数,其API如下:
void circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=LINE_8, int shift=0)
其中,各个参数的含义如下:
- img:需要绘制圆形的图像
- center:圆形的中心点坐标
- radius:圆形的半径
- color:圆形的颜色
- thickness:圆形的线条粗细
- lineType:圆形线条的类型
- shift:圆形线条位置的小数位数
二、如何在图片中绘制圆形
在OpenCV中绘制圆形有两种方式,一种是将圆形绘制在原图上,另一种是将圆形绘制在新的空白图片上。
三、在原图上绘制圆形
在原图上绘制圆形的主要步骤如下:
- 读取一张图片,使用circle函数绘制圆形
- 显示绘制后的图片
具体代码如下:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("test.jpg");
circle(img, Point(img.cols / 2, img.rows / 2), 50, Scalar(0, 0, 255), 2);
imshow("img", img);
waitKey(0);
return 0;
}
四、在空白图片上绘制圆形
在空白图片上绘制圆形的主要步骤如下:
- 创建一张空白的图片,使用circle函数绘制圆形
- 显示绘制后的图片
具体代码如下:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = Mat::zeros(Size(500, 500), CV_8UC3);
circle(img, Point(img.cols / 2, img.rows / 2), 50, Scalar(0, 0, 255), 2);
imshow("img", img);
waitKey(0);
return 0;
}
五、如何绘制多个圆形
需要绘制多个圆形时,只需要多次使用circle函数即可。
具体代码如下:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("test.jpg");
circle(img, Point(100, 100), 50, Scalar(0, 0, 255), 2);
circle(img, Point(200, 200), 50, Scalar(0, 255, 0), 2);
circle(img, Point(300, 300), 50, Scalar(255, 0, 0), 2);
imshow("img", img);
waitKey(0);
return 0;
}
六、实际案例:在视频中实时检测并标注圆形
在实际应用中,需要实时检测并标注一些目标,比如检测一个运动的球并画出其轨迹。具体步骤如下:
- 打开摄像头,读取视频流
- 对每一帧图像进行处理,使用circle函数检测并绘制目标圆形
- 显示处理后的每一帧图像
具体代码如下:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
std::cout << "Cannot open camera!" << std::endl;
return -1;
}
namedWindow("img", WINDOW_AUTOSIZE);
int last_x = -1, last_y = -1;
while (true)
{
Mat frame;
cap >> frame;
if (frame.empty()) break;
Mat gray, canny;
cvtColor(frame, gray, COLOR_BGR2GRAY);
Canny(gray, canny, 50, 150, 3);
std::vector<Vec3f> circles;
HoughCircles(canny, circles, HOUGH_GRADIENT, 1, canny.rows / 8, 150, 30, 0, 0);
if (!circles.empty())
{
for (const auto& circle : circles)
{
int x = (int)circle[0];
int y = (int)circle[1];
int radius = (int)circle[2];
circle(frame, Point(x, y), radius, Scalar(0, 0, 255), 2);
if (last_x != -1 && last_y != -1)
line(frame, Point(x, y), Point(last_x, last_y), Scalar(0, 255, 0), 2);
last_x = x;
last_y = y;
}
}
else
{
last_x = -1;
last_y = -1;
}
imshow("img", frame);
if (waitKey(30) == 'q') break;
}
return 0;
}