【图像处理】OpenCV系列三十--- clipLine、dra
上一节我们学习了基本的绘图函数,相信大家学习之后,已经有了基本的认识,从现在,本节呢,我们学习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对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!