OpenCV绘制图形功能

1、绘制直线

绘制直线函数是cv::line,函数完整形式如下

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
/*
@param img 图像
@param pt1 线段端点1
@param pt2 线段端点2
@param color 线段颜色
@param thickness 线宽
@param lineType 线的类型
@param shift 点坐标的小数位偏移
*/

color可以使用cv::Scalar构造,但是传入参数的顺序是BGR,使用CV_RGB宏更直观,以RGB顺序传入;

lineType取值有LINE_4、LINE_8和LINE_AA,分别表示4连接线,8连接线,抗锯齿线,是以不同的算法产生直线(也可以是FILLED=-1,直接填充);

shift是指点坐标的二进制表示的位偏移,每加1坐标值减一半,实验的结果,不知道理解的对不对,使用默认值0就可以了;

在两个点之间绘制线宽为1的红色直线定义为一个函数

void DrawLine(const cv::Mat& destImg, const cv::Point& pt1, const cv::Point& pt2)
{
    cv::line(destImg, pt1, pt2, CV_RGB(255, 0, 0), 1);
}

下面的实例在鼠标两次点击位置中间画一根直线,绘制完成可以按Enter键保存图像。

cv::Mat g_originImage;//原始图像
cv::Mat g_editImage;//编辑的图像
std::vector<cv::Point> g_editPoints;//正在绘制的图形的点
std::vector<std::vector<cv::Point>> g_lines;//所有的线段

void RedrawAllLines()
{
    g_originImage.copyTo(g_editImage);//恢复背景图像
    for (int i = 0; i < g_lines.size(); i++)
    {
        if (g_lines[i].size() >= 2)
        {
            DrawLine(g_editImage,g_lines[i][0], g_lines[i][1]);
        }
    }
}
void OnDrawLineMouseEvent(int event, int x, int y, int flags, void* userdata)
{
    if (event == cv::EVENT_LBUTTONDOWN)
    {
        if (g_editPoints.size() > 0)
        {
            //在第二个点按下鼠标之后添加到线段列表中,并重绘图像
            g_editPoints.push_back(cv::Point(x, y));
            g_lines.push_back(g_editPoints);
            RedrawAllLines();
            g_editPoints.clear();
            imshow("image", g_editImage);
        }
        else
        {
            g_editPoints.push_back(cv::Point(x, y));//第一个点
        }
    }
    else if (event == cv::EVENT_MOUSEMOVE)
    {
        if (g_editPoints.size() > 0)
        {
            //鼠标移动中,绘制到鼠标位置的直线,但鼠标当前点不加入到g_editPoints中
            RedrawAllLines();
            DrawLine(g_editImage,g_editPoints[g_editPoints.size() - 1], cv::Point(x, y));
            imshow("image", g_editImage);
        }
    }
}

int main(int argc, char **arv)
{
    g_originImage = cv::imread("walkers.jpg");
    g_originImage.copyTo(g_editImage);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一款非常强大的计算机视觉库,其中包含了很多功能强大的图像处理和计算机视觉算法。而在这个系列的第三篇文章中,我们将重点介绍如何在OpenCV绘制图形和文本。 OpenCV绘制图形的函数包括cv2.line(直线),cv2.rectangle(矩形),cv2.circle(圆),cv2.ellipse(椭圆)和cv2.putText(文本)。这些函数的使用非常简单,只需要指定图像,开始点和结束点(或中心点和半径),颜色和线宽即可。 例如,我们可以使用cv2.rectangle函数在图像上绘制一个矩形: ``` import cv2 import numpy as np img = np.zeros((512,512,3), np.uint8) # 创建一个黑色的图像 cv2.rectangle(img,(384,0),(510,128),(0,255,0),3) # 绘制矩形 cv2.imshow("image",img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先创建了一个512x512的黑色图像,然后使用cv2.rectangle函数在图像上绘制了一个矩形,并将其显示出来。在这里,矩形的左上角坐标是(384,0),右下角坐标是(510,128),颜色是绿色(0,255,0),线宽为3。 除了绘制图形,我们也可以使用cv2.putText函数在图像上绘制文本。这个函数的使用也非常简单,只需要指定图像,文本内容,位置,字体,字体大小和颜色即可。 例如,我们可以使用cv2.putText函数在图像上写入一个“Hello World!”的文本: ``` import cv2 import numpy as np img = np.zeros((512,512,3), np.uint8) # 创建一个黑色的图像 font = cv2.FONT_HERSHEY_SIMPLEX # 设置字体 cv2.putText(img,'Hello World!',(10,500), font, 1,(255,255,255),2,cv2.LINE_AA) # 绘制文本 cv2.imshow("image",img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们使用cv2.putText函数在左下角绘制了一个“Hello World!”的文本,并将其显示出来。在这里,我们首先选取了字体类型为cv2.FONT_HERSHEY_SIMPLEX,然后指定了文本的位置(10,500),字体大小为1,颜色为白色(255,255,255),线宽为2,并且使用了cv2.LINE_AA参数,以实现更好的文本渲染效果。 综上所述,OpenCV中可以很方便地对图像进行绘制和文本处理,这对于图像处理和计算机视觉应用来说是非常重要的一步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值