美文网首页摄影散文旅行·在路上
【图像处理】OpenCV系列三十--- clipLine、dra

【图像处理】OpenCV系列三十--- clipLine、dra

作者: 307656af5a04 | 来源:发表于2019-05-14 05:55 被阅读11次

    上一节我们学习了基本的绘图函数,相信大家学习之后,已经有了基本的认识,从现在,本节呢,我们学习clipLine和drawMarker函数。

    一、clipLine()函数详解

    1、函数原型

    // 原型一
    // 如果直线line任何一部分在图像大小Size内,则返回true
    bool clipLine(Size imgSize, 
        CV_IN_OUT Point& pt1, 
        CV_IN_OUT Point& pt2);
    
    // 原型二
    // 如果直线line任何一部分在图像大小Size内,则返回true
    bool clipLine(Size2l imgSize, 
        CV_IN_OUT Point2l& pt1, 
        CV_IN_OUT Point2l& pt2);
    
    // 原型三
    // 如果直线line任何一部分在矩形 'imgRect'内,则返回true
    bool clipLine(Rect imgRect, 
        CV_OUT CV_IN_OUT Point& pt1, 
        CV_OUT CV_IN_OUT Point& pt2);
    

    2、函数功能
    判断一条直线是否在矩形内;

    3、参数详解

    • 第一个参数,Size imgSize,如果直线line任何一部分在图像大小Size内,则返回true;

    • 第二个参数,Rect imgRect,如果直线line任何一部分在矩形 'imgRect'内,则返回true;

    • 第三个参数,CV_IN_OUT Point& pt1,直线的第一个端点;

    • 第四个参数,CV_IN_OUT Point& pt2,直线的第二个端点;

    4、实验实例

    #include <iostream>
    #include <opencv2/opencv.hpp>
    using namespace std;
    using namespace cv;
    
    
    int main(int argc, char** argv)
    {
        bool res = clipLine(Size(100, 100), 
            Point(101, 101), Point(120, 120));
    
        if (res)
        {
            cout << "直线在Size内部" << endl;
        }
        else
        {
            cout << "直线不在Size内部" << endl;
        }
    
        bool resRect = clipLine(Rect(100, 100, 100, 100), 
            Point(51, 51), Point(201, 201));
    
        if (resRect)
        {
            cout << "直线在Rect内部" << endl;
        }
        else
        {
            cout << "直线不在Rect内部" << endl;
        }
    
        system("pause");
        return 0;
    }
    

    4、实验结果

    实验结果

    一、drawMarker()函数详解

    1、函数原型

    void drawMarker(InputOutputArray img, 
        Point position, 
        const Scalar& color,
        int markerType = MARKER_CROSS, 
        int markerSize = 20, 
        int thickness = 1,
        int line_type = 8);
    

    2、函数功能
    在图像预定义的位置上绘制标记;

    目前支持几种标记类型:
    (1) MARKER_CROSS,十字标记形状;
    (2) MARKER_TILTED_CROSS,一个45度倾斜的十字标记形状;
    (3) MARKER_STAR,星标形状,交叉和倾斜交叉的组合;
    (4) MARKER_DIAMOND,钻石标记形状;
    (5) MARKER_SQUARE,方形标志形状;
    (6) MARKER_TRIANGLE_UP,一个向上指向的三角形标记形状;
    (7) MARKER_TRIANGLE_DOWN,向下指向三角形标志形状;

    3、参数详解

    • 第一个参数,InputOutputArray img,待绘制标记的图像;

    • 第二个参数,Point position,绘制的中心坐标

    • 第三个参数,const Scalar& color,绘制标记的颜色;

    • 第四个参数,int markerType = MARKER_CROSS,绘制标记;

    • 第五个参数,int markerSize = 20,绘制标记的大小;

    • 第六个参数,int thickness = 1,线段的粗细;

    • 第七个参数,int line_type = 8,线段的类型;

    线的类型:
    FILLED,填充;
    LINE_4,4连通的线条;
    LINE_8 ,8连通的线条;
    LINE_AA ,抗锯齿线条;

    4、实验实例

    #include <iostream>
    #include <opencv2/opencv.hpp>
    using namespace std;
    using namespace cv;
    
    // 原始图像
    Mat src;
    
    // 标记的类型
    int value = 1;
    
    // 回调函数
    void OnMark(int, void*)
    {
        // 对原始图像进行备份
        Mat dst = src.clone();
    
        // 绘制标记
        drawMarker(dst,
            Point(src.cols / 2, src.rows / 2),
            Scalar(0, 255, 0), value, 100, 3);
    
        // 显示绘制标记后的图像
        imshow("src", dst);
    }
    
    int main(int argc, char** argv)
    {
        // 载入图像
        src = imread("lena.png");
        
        // 判断图像是否为空
        if (src.empty())
        {
            cout << "image error!" << endl;
            return -1;
        }
    
        // 创建窗口
        namedWindow("src");
    
        // 创建滑动条
        createTrackbar("绘制标记", "src", &value, 6, OnMark);
    
        // 调用回调函数
        OnMark(value, 0);
    
        waitKey(0);
        return 0;
    }
    

    5、实验结果

    十字标记 45度十字标记 星标形状,交叉和倾斜交叉的组合 钻石标记 方形标志形状 向上指向三角形标志形状 向下指向三角形标志形状

    我是奕双,现在已经毕业将近两年了,从大学开始学编程,期间学习了C语言编程,C++语言编程,Win32编程,MFC编程,毕业之后进入一家图像处理相关领域的公司,掌握了用OpenCV对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!

    相关文章

      网友评论

        本文标题:【图像处理】OpenCV系列三十--- clipLine、dra

        本文链接:https://www.haomeiwen.com/subject/kidnoqtx.html