使用cv::Point与cv::Scalar
- Point表示2D平面上一个点x,y
Point p;
p.x = 10;
p.y = 8;
or
p = Pont(10,8); - Scalar表示四个元素的向量
Scalar(a, b, c);// a = blue, b = green, c = red表示RGB三个通道
绘制线、矩形、园、椭圆等基本几何形状
- 画线 cv::line (LINE_4\LINE_8\LINE_AA)
- 画椭圆cv::ellipse
- 画矩形cv::rectangle
- 画圆cv::circle
- 画填充cv::fillPoly
- 可以通过多边形填充来填充矩形
随机生成与绘制文本
随机数生成cv::RNG
- 生成高斯随机数gaussian (double sigma)
- 生成正态分布随机数uniform (int a, int b)
绘制添加文字
putText函数 中设置fontFace(cv::HersheyFonts),
- fontFace, CV_FONT_HERSHEY_PLAIN
- fontScale , 1.0, 2.0~ 8.0
相关函数
1,绘制直线
void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
参数1:img,要绘制线段的图像。
参数2:pt1, 线段的起点。
参数3:pt2,线段的终点。
参数4:color,线段的颜色,通过一个Scalar对象定义。
参数5:thickness, 线条的宽度。
参数6:lineType, 线段的类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波)。
参数7:shift,坐标点小数点位数。(一般用不到)
功能:在图像img绘制由点pt1到点pt2的直线,其中颜色为color,线宽为thickness。
2,绘制长方形
- void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
参数1:img,图像.
参数2:pt1,矩形的一个顶点。
参数3:pt2,矩形对角线上的另一个顶点
参数4:color,线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
参数5:thickness,组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
参数6:line_type,线条的类型。
参数7:shift,坐标点的小数点位数。 - Rect roi_rect = Rect(128, 128, roi.cols, roi.rows);
Rect(x,y,width,height)
参数1:x为所定义矩形的左上角横坐标
参数2:y为所定义矩形的左上角纵坐标
参数3:width为所定义矩形的宽度
参数4:height 为所定义矩形的高度
功能:Rect为矩形类用来定义矩形的数据,再使用cvRectangle函数将其绘制出来。 - rectangle(bgImage, rect, color, 2, LINE_8);
此处就是将rect定义的矩形使用rectangle函数绘制到图像bgImage上去。
3,绘制椭圆
void cvEllipse( CvArr* img, CvPoint center, CvSize axes, double angle, double start_angle, double end_angle, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
参数1:img,图像。
参数2:center,椭圆圆心坐标。
参数3:axes,轴的长度。
参数4:angle,偏转的角度。
参数5:start_angle,圆弧起始角的角度。.
参数6:end_angle,圆弧终结角的角度。
参数7:color,线条的颜色。
参数8:thickness,线条的粗细程度。
参数9:line_type,线条的类型。
参数10:shift,圆心坐标点和数轴的精度。
功能:函数cvEllipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形。圆弧被ROI矩形所忽略。反走样弧线和粗弧线使用线性分段近似值。所有的角都是以角度的形式给定的。
4,绘制圆
void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
参数1:img,图像。
参数2:center,圆心坐标。
参数3:radius,圆形的半径。
参数4:color,线条的颜色。
参数5:thickness,如果是正数,表示组成圆的线条的粗细程度。否则,若为负数,表示圆是否被填充。
参数6:line_type,线条的类型。
参数7:shift,圆心坐标点和半径值的小数点位数。(一般用不到)
功能:函数cvCircle绘制或填充一个给定圆心和半径的圆。圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r, g, b ),或者Scalar( r, g, b )。
5,填充多边形
- void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType = LINE_8, int shift = 0, Point offset = Point() );
参数1:img,图像
参数2:pts,多边形的顶点集(是个二维数组)
参数3:npts,多边形顶点数目
参数4:ncontours,要绘制的多边形数量为1
参数5:多边形的颜色定义为Scarlar(255,255,255),即RGB的值为白色
参数6:lineType 多边形线条类型。
参数7:offset 偏移量设置,此处可以对多边形进行位置的偏移。
6,绘制文字
void cv::putText(cv::Mat& img, const string& text, cv::Point origin, int fontFace, double fontScale, cv::Scalar color, int thickness = 1, int lineType = 8, bool bottomLeftOrigin = false);
参数1:img, 待绘制的图像
参数2: text, 待绘制的文字
参数3:origin, 文本框的左下角
参数4:fontFace, 字体 (如cv::FONT_HERSHEY_PLAIN)
参数5: fontScale, 尺寸因子,值越大文字越大
参数6: color, 线条的颜色(RGB)
参数7:thickness,线条宽度
参数8:lineType,线型
参数9:当为true时文字处于文本框左下角,否则处于左上角
代码实现效果
1,绘制直线
2,绘制长方形
3,绘制椭圆
4,绘制圆
5,填充多边形
6,绘制文字
7,整体显示效果
8,绘制随机线(自定义函数)
代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
const char* drawdemo_win = "draw shapes and text demo";//定义一个窗口名
void Mylines(Mat &bgImage);//自定义函数(里面需传递图像变量)
void MyRectangle(Mat &bgImage);
void MyEllipse(Mat &bgImage);
void MyCircle(Mat &bgImage);
void MyPolygon(Mat &bgImage);
void RandomLineDemo(Mat &bgImage);
int main(){
Mat bgImage = imread("1.jpg");
if (bgImage.empty()){
cout << "image could not load ..." << endl;
getchar();
return -1;
}
Mylines(bgImage);
MyRectangle(bgImage);
MyEllipse(bgImage);
MyCircle(bgImage);
MyPolygon(bgImage);
putText(bgImage, "Hello OpenCV", Point(300, 300), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 23, 200), 3, 8);//打印文字
imshow(drawdemo_win, bgImage);
//RandomLineDemo(bgImage);
waitKey(0);
return 0;
}
void Mylines(Mat &bgImage){
Point p1 = Point(20, 30);
Point p2;
p2.x = 300;
p2.y = 300;
Scalar color = Scalar(0, 0, 255);//定义一个颜色为红色
line(bgImage, p1, p2, color, 1, LINE_8);//在图像bgImage上画一条由p1到p2点的线
//line(bgImage, p1, p2, color, 1, LINE_AA);//采用反锯齿,效果比较好,但效率略低
}
void MyRectangle(Mat &bgImage){
Rect rect = Rect(300, 50, 300, 300);
Scalar color = Scalar(255, 0, 0);
rectangle(bgImage, rect, color, 2, LINE_8);
}
//绘制椭圆
void MyEllipse(Mat &bgImage) {
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);//Point椭圆中心,Size表示长轴、短轴
//ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 180, color, 2, LINE_8);//此处只绘制一半的弧度
}
void MyCircle(Mat &bgImage) {
Scalar color = Scalar(0, 255, 255);
Point center = Point(bgImage.cols / 2, bgImage.rows / 2);
circle(bgImage, center, 150, color, 2, 8);
}
//填充多边形
void MyPolygon(Mat &bgImage) {
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(150, 150);
const Point* ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar(255, 12, 255);
fillPoly(bgImage, ppts, npt, 1,color,8);
}
//画随机线
void RandomLineDemo(Mat &bgImage) {
RNG rng(12345);//定义一个随机数
Point pt1;
Point pt2;
Mat bg = Mat::zeros(bgImage.size(), bgImage.type());//创建一个空白图像
namedWindow("random line demo", CV_WINDOW_AUTOSIZE);
for (int i = 0; i < 100000; i++) {
pt1.x = rng.uniform(0, bgImage.cols);//随机数在image图像内生成(不能超过边缘)
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) {//在50ms后跳出循环
break;
}
line(bg, pt1, pt2, color, 1, 8);
imshow("random line demo", bg);
}
}