opencv简单形状绘制

来源:互联网 发布:linux posix 编辑:程序博客网 时间:2024/04/30 05:40

今天继续opencv的学习,今天学习的内容是,画一些简单的形状,比如直线、方形等。

主要涉及的函数:

(1)Mat::zeros(Size size,Type type)//可以用来初始化一个背景全黑的画板。

(2)Point对象,初始化方式Point(int x,int y),用来建立一个点对象,在图形绘制上常用。

(3)Scalar对象,用来建立颜色对象,初始化时最对四个通道。

(4)line(Mat对象,点1,点2,颜色,线粗,线型)//Mat对象是画板对象,点1、点2是直线两端,颜色就是线的颜色,线型有三种,默认LINE_8,LINE_AA是抗锯齿类型。

(5)Rect对象用来确定矩形得对角点位置,初始化方式Rect(点1,点2),rectangle(Mat对象,Rect对象,颜色,线粗,线型)

(6)Size对象用来确定图形图像得长宽参数,初始化方式Size(int x,int y),ellipse(Mat对象,中心点对象,Size对象,旋转角度,绘制起始角度,绘制终止角度,颜色,线粗,线型)//Size对象得x代表椭圆长轴半径,y代表椭圆短轴半径,旋转角度表示椭圆得整体旋转角度,当角度为0时,长轴对应横轴,绘制起始和终止角度代表绘制覆盖的角度。

(7)circle(Mat对象,圆心点,半径,颜色,线粗,线型)

(8)多边形填充,实现比较复杂,看演示代码。

(9)填写文字putText(Mat对象,要写的字符串,初始位置点,字体,字的大小,颜色,线粗,线型)


演示代码:

#include<opencv2\opencv.hpp>#include<iostream>#include<math.h> using namespace std;using namespace cv;void showLine(Mat &pic);void showRect(Mat &pic);void showEllipse(Mat &pic);void showCircle(Mat &pic);void showPoly(Mat &pic);void showText(Mat &pic);int main(){Size size(1000, 800);Mat pic=Mat::zeros(size,CV_8UC3);showLine(pic);showRect(pic);showEllipse(pic);showCircle(pic);showPoly(pic);showText(pic);namedWindow("show");imshow("show", pic);waitKey(0);return 0;}void showLine(Mat &pic){Point p1(100, 100), p2(500, 500);Scalar color(0, 0, 255);line(pic, p1, p2, color, 2, LINE_AA);}void showRect(Mat &pic){Point p1(100, 100), p2(500, 500);Rect rec(p1, p2);Scalar color(0, 255, 0);rectangle(pic, rec, color, 2, LINE_AA);}void showEllipse(Mat &pic){Point cen(300, 300);Size len(200, 100);Scalar color(255, 0, 0);ellipse(pic, cen, len, 0, 0, 360, color, 2, LINE_AA);ellipse(pic, cen, len, 45, 0, 360, color, 2, LINE_AA);ellipse(pic, cen, len, 90, 0, 180, color, 2, LINE_AA);}void showCircle(Mat &pic){Point cen(300, 300);Scalar color(255, 255, 255);circle(pic, cen, 200, color, 2, LINE_AA);}void showPoly(Mat &pic){Point p[1][4];//表示多边形路径点p[0][0] = Point(800, 300);p[0][1] = Point(900, 500);p[0][2] = Point(700, 500);p[0][3] = Point(800, 300);//起始点和终止点相同const Point* pp[] = { p[0] };//获取const Point的二维数组指针int np[] = { 4 };//代表点数Scalar color(0, 200, 100);fillPoly(pic, pp, np, 1,color, 8);//pp和np必须要这么写,第四个参数写1就行,表示画一圈,这个函数很死板}void showText(Mat &pic){Point p(300, 50);Scalar color(0, 0, 255);putText(pic, "Hello World!!!", p, CV_FONT_BLACK, 2.0, color, 2, LINE_AA);}


效果:




=========================================分割线=============================================================

下面在说一下随机直线

主要是利用RNG对象的uniform函数生成随机数,并用这些随机数建立线的两端点,随带介绍一下waitKey函数,waitKey(int x)//表示程序等待xms,如果有按键输入,就返回按键的ASCII,否则返回0xff(之前网上说返回-1,但是返回值是int,我电脑上返回的是255,但是有的人返回-1,这我就不太懂了),如果x==0,则一直等待按键输入。

演示代码:

#include<opencv2\opencv.hpp>#include<iostream>#include<math.h>#include<algorithm>#include<string.h>using namespace std;using namespace cv;void showRandomLine(Mat &pic);int main(){Size size(1000, 800);Mat pic = Mat::zeros(size, CV_8UC3);showRandomLine(pic);waitKey(0);return 0;}void showRandomLine(Mat &pic){RNG rng;int a;Point p1, p2;for(int i=0;i<100;i++){p1.x = rng.uniform(0, 1000);p1.y = rng.uniform(0, 800);p2.x = rng.uniform(0, 1000);p2.y = rng.uniform(0, 800);int b = rng.uniform(0, 255);int g = rng.uniform(0, 255);int r = rng.uniform(0, 255);Scalar color(b, g, r);line(pic, p1, p2, color, 1, LINE_8);if (waitKey(50) != 0xff)break;imshow("show", pic);}}

效果:




0 0
原创粉丝点击