摄影散文旅行·在路上

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

2019-05-14  本文已影响11人  307656af5a04

上一节我们学习了基本的绘图函数,相信大家学习之后,已经有了基本的认识,从现在,本节呢,我们学习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、参数详解

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、参数详解

线的类型:
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对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!

上一篇下一篇

猜你喜欢

热点阅读