一.Point与Scalar
使用cv::Point与cv::Scalar
Point表示2D平面上一个点x,y
Point p;
p.x = 10;
p.y = 8;
或者
p = Pont(10,8);
Scalar表示四个元素的向量
Scalar(a, b, c);// a = blue, b = green, c = red表示RGB三个通道
=========================================================================
二.使用line,ellipse,ellipse,rectangle,fillPoly函数绘制线、矩形、园、椭圆等基本几何形状
画线 cv::line (LINE_4\LINE_8\LINE_AA)
void cvPolyLine( CvArr* img, CvPoint** pts, int* npts, int contours, int is_closed,CvScalar color, int thickness=1, int line_type=8, int shift=0 );
参数说明:
img 输入图像
pts 折线的顶点指针数组
npts 折线的定点个数数组,也可以认为是pts指针数组的大小
contours 折线的线段数量
is_closed 指出多边形是否封闭。如果封闭,函数将起始点和结束点连线。
color 折线的颜色
thickness 线条的粗细程度
line_type 线段的类型。参见cvLine
shift 顶点的小数点位数
画椭圆cv::ellipse
void DrawEllipse(Mat img, double angle)
{
int thickhness = 2;
int lineType = 8;
ellipse( img,
Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2),
Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16),
angle,
0, 360,
Scalar(255, 129, 0),
thickhness,
lineType);
}
画矩形cv::rectangle
rectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
Img输入的图像
pt1矩形上的一个顶点坐标
pt2矩形对角线上的另一个顶点坐标
color线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)
thickness组成矩形的线条的粗细程度,取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形
line_type线条的类型。见cvLine的描述
shift坐标点的小数点位数
画圆cv::circle
void DrawFilledCircle(Mat img, Point center) {
int thickness = -1;
int lineType = 8;
circle(img, center, WINDOW_WIDTH / 32,Scalar(0, 0, 255),thickness, lineType);
}
画填充cv::fillPoly
函数可以填充复杂的区域,例如,有漏洞的区域和有交叉点的区域等等。
void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours,CvScalar color, int line_type=8, int shift=0 );
img 输入图像
pts 指向多边形的数组指针
npts 多边形的顶点个数的数组
contours 组成填充区域的线段的数量
color 多边形的颜色
line_type 组成多边形的线条的类型
shift 顶点坐标的小数点位数
绘制文字cv: putTex
void putText( InputOutputArray img,
const String& text,
Point org,
int fontFace,
double fontScale,
Scalar color,
int thickness = 1,
int lineType = LINE_8,
bool bottomLeftOrigin = false );
参数说明
cv::Mat& img 待绘制的图像,作为画布
const string& text 待绘制的文字
cv::Point org 文本框的左下角
int fontFace 字体 (如cv::FONT_HERSHEY_PLAIN)
double fontScale 尺寸因子,值越大文字越大
Scalar color 线条的颜色(RGB)
int thickness = 1 线条宽度,默认为1
int lineType = LINE_8 线型,4邻域或8邻域,默认8邻域
bool bottomLeftOrigin = false true=‘origin at lower left’
=========================================================================
三.Opencv随机数的生成
RNG类是opencv里C++的随机数产生器。它可产生一个64位的int随机数。目前可按均匀分布和高斯分布产生随机数。随机数的产生采用的是Multiply-With-Carry算法和Ziggurat算法。
RNG可以产生3种随机数
RNG(int seed) 使用种子seed产生一个64位随机整数,默认-1
RNG::uniform( ) 产生一个均匀分布的随机数
RNG::gaussian( ) 产生一个高斯分布的随机数
RNG::uniform(a, b ) 返回一个[a,b)范围的均匀分布的随机数,a,b的数据类型要一致,而且必须是int、float、double中的一种,默认是int。
RNG::gaussian( σ) 返回一个均值为0,标准差为σ的随机数。如果要产生均值为λ,标准差为σ的随机数,可以λ+ RNG::gaussian( σ)
生成高斯随机数gaussian (double sigma)
生成正态分布随机数uniform (int a, int b)
=========================================================================
代码实现
#include"stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat bgImage;
const char* drawdemo_win = "draw shapes and text demo";
void MyLines(); //画线
void MyRectangle(); //画矩形
void MyEllipse(); //画椭圆
void MyCircle(); //画圆形
void MyPolygon(); //填充
void RandomLineDemo();
void MyLines() {
Point p1 = Point(20, 30);
Point p2;
p2.x = 400;
p2.y = 400;
Scalar color = Scalar(0, 0, 255);
line(bgImage, p1, p2, color, 1, LINE_AA);
}
void MyRectangle() {
Rect rect = Rect(200, 100, 300, 300);
Scalar color = Scalar(255, 0, 0);
rectangle(bgImage, rect, color, 2, LINE_8);
}
void MyEllipse() {
Scalar color = Scalar(0, 255, 0);
ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 360, color, 2, LINE_8);
}
void MyCircle() {
Scalar color = Scalar(0, 255, 255);
Point center = Point(bgImage.cols / 2, bgImage.rows / 2);
circle(bgImage, center, 150, color, 2, 8);
}
void MyPolygon() {
Point pts[1][5];
pts[0][0] = Point(100, 100);
pts[0][1] = Point(100, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);
const Point* ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar(255, 12, 255);
fillPoly(bgImage, ppts, npt, 1, color, 8);
}
void RandomLineDemo() {
RNG rng(12345);
Point pt1;
Point pt2;
Mat bg = Mat::zeros(bgImage.size(), bgImage.type());
namedWindow("random line demo", 0);
resizeWindow("random line demo",400, 400);
for (int i = 0; i < 100000; i++) {
pt1.x = rng.uniform(0, bgImage.cols);
pt2.x = rng.uniform(0, bgImage.cols);
pt1.y = rng.uniform(0, bgImage.rows);
pt2.y = rng.uniform(0, bgImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
if (waitKey(50) > 0) {
break;
}
line(bg, pt1, pt2, color, 1, 8);
imshow("random line demo", bg);
}
}
int main(int argc, char** argv) {
bgImage = imread("F:/photo/c.jpg");
if (!bgImage.data) {
printf("could not load image...\n");
return -1;
}
//MyLines();
//MyRectangle();
MyEllipse();
//MyCircle();
//MyPolygon();
putText(bgImage, "Hello OpenCV", Point(300, 300), FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 23, 200), 3, 8);
namedWindow(drawdemo_win,0);
resizeWindow(drawdemo_win, 400, 400);
imshow(drawdemo_win, bgImage);
RandomLineDemo();
waitKey(0);
return 0;
}
=========================================================================
图像处理效果:
void MyLines(); //画线
void MyRectangle(); //画矩形
void MyEllipse(); //画椭圆
void MyCircle(); //画圆形
void MyPolygon(); //填充
void RandomLineDemo();