OpenCV学习笔记四:绘图

    xiaoxiao2021-03-25  114

    1、利用函数绘图

    函数原型:

    1、直线

    void line(Mat& img, Point pt1,Point pt2, const Scalar& color, int thickness=1, int lineType=8,int shift=0) img – 图像.pt1 – 起点.pt2 – 终点.color – 颜色.thickness – 线宽.lineType – 线型(4联通,8联通,反锯齿)shift – 坐标点小数点位数.

    2、矩形

    void rectangle(Mat& img,Point pt1, Pointpt2, const Scalar&color, intthickness=1,intlineType=8, intshift=0) void rectangle(Mat& img,Rect rec, const Scalar&color, intthickness=1, intlineType=8,intshift=0 ) img – 图像pt1 – 左上角pt2 – 右下角rec – 确定矩形的另一种方式,给左上角坐标和长宽color – 颜色thickness – 线宽lineType – 线型(4联通,8联通,反锯齿)shift –坐标点的小数点位数

    3、椭圆

    void ellipse(Mat& img, Point center,Size axes, double angle, double startAngle, double endAngle, const Scalar& color,int thickness=1, int lineType=8, int shift=0) void ellipse(Mat& img, constRotatedRect& box, const Scalar& color, int thickness=1, int lineType=8) img – 椭圆所在图像.center – 椭圆中心.axes – 椭圆主轴一半的长度angle – 椭圆旋转角度startAngle – 椭圆弧起始角度endAngle –椭圆弧终止角度box – 指定椭圆中心和旋转角度的信息,通过 RotatedRect 或 CvBox2D. 这表示椭圆画在旋转矩形上(矩形是不可见的,只是指定了一个框而已)color – 颜色.thickness – 正值代表线宽,负值代表填充的椭圆lineType – 线型shift – 坐标的小数点位数

    4、多边形

    void polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 ) void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 ) img – 所在图像.pts – 折线中拐点坐标指针.npts – 折线拐点个数指针.ncontours – 折线线段数量.isClosed – 折线是否闭合.color – 折线颜色.thickness – 折线宽度.lineType – 线型.shift – 顶点坐标小数点位数

    五、文字

    void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false ) img – 显示文字所在图像.text – 待显示的文字.org – 文字在图像中的左下角 坐标.font – 字体结构体.fontFace – 字体类型, 可选择字体:FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX,FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX, orFONT_HERSHEY_SCRIPT_COMPLEX,以上所有类型都可以配合 FONT_HERSHEY_ITALIC使用,产生斜体效果。fontScale – 字体大小,该值和字体内置大小相乘得到字体大小color – 文本颜色thickness – 写字的线的粗细,类似于0.38的笔尖和0.5的笔尖lineType – 线型bottomLeftOrigin – true, 图像数据原点在左下角. Otherwise, 图像数据原点在左上角.

    示例

    #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat image(500,500,CV_8UC3,Scalar(255,255,255)); //画线 line(image,Point(0,0),Point(499,499),Scalar(0,255,0),5); //矩形 rectangle(image,Point(200,50),Point(300,150),Scalar(255,0,0),-1); //椭圆 ellipse(image,RotatedRect(Point(100,200),Size(200,100),0),Scalar(0,0,255),3); //多边形 Point rook_points[1][20]; rook_points[0][3] = Point( 440, 100 ); rook_points[0][0] = Point(350, 100 ); rook_points[0][1] = Point( 370, 190 ); rook_points[0][2] = Point( 440, 290 ); const Point* ppt[1] = { rook_points[0] }; int npt[] = { 4 }; polylines(image,ppt,npt,1,1,Scalar(128,128,255),2,8,0); //矩形 putText(image,"OpenCV",Point(100.400),FONT_HERSHEY_SIMPLEX,3,Scalar(255,10,128),4,CV_AA); namedWindow("image"); imshow("image",image); waitKey(0); return 0; }

    二、利用鼠标绘图

    利用鼠标绘图主要是通过捕获鼠标事件完成,OpenCV提供了setMouseCallback函数用以设置鼠标事件的回调函数,在回调函数中通过判断不同的鼠标事件(鼠标按下,移动,释放等)做对应的操作。

    示例

    #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; Mat image; void drawWithMouse(int event,int x,int y,int flags,void *param); int main() { image = Mat(500,500,CV_8UC3,Scalar(255,255,255)); namedWindow("image"); imshow("image",image); setMouseCallback("image",drawWithMouse,0); waitKey(0); return 0; } void drawWithMouse(int event,int x,int y,int flags,void *param) { static Point start; static bool mouseDown = false; if(event==CV_EVENT_LBUTTONDOWN) { start.x = x; start.y = y; mouseDown = true; } else if(mouseDown && event == CV_EVENT_MOUSEMOVE) { line(image,start,Point(x,y),Scalar(128,128,255),2,CV_AA); imshow("image",image); start.x = x; start.y = y; } else if(event == CV_EVENT_LBUTTONUP) { mouseDown = false; } }

    转载请注明原文地址: https://ju.6miu.com/read-16549.html

    最新回复(0)