博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv学习笔记七(绘制图像和文字)
阅读量:3959 次
发布时间:2019-05-24

本文共 5914 字,大约阅读时间需要 19 分钟。

绘制图像和文字

使用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 
#include
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); }}

转载地址:http://tzozi.baihongyu.com/

你可能感兴趣的文章
通用 Makefile 的编写方法以及多目录 makefile 写法
查看>>
C++的4种智能指针剖析使用
查看>>
RPC框架实现之容灾策略
查看>>
Docker私库
查看>>
hdu——1106排序(重定向)
查看>>
hdu——1556Color the ball(树状数组)
查看>>
hdu——1541Stars(树状数组)
查看>>
快速幂的精简代码
查看>>
求大数乘方的前n位数字(对数加快速幂)
查看>>
hdu——2602Bone Collector(第一类背包问题)
查看>>
hdu——1711Number Sequence(kmp专练)
查看>>
strstr函数和find函数的异同
查看>>
Java的反射
查看>>
HTTP请求之POST与GET区别
查看>>
SSM结合Redis
查看>>
优化数据库的八种方法
查看>>
Java Web服务收到请求时线程的情况以及session情况
查看>>
SSM配置文件信息加密实现
查看>>
@Produces注解
查看>>
谈谈序列化—实体bean一定要实现Serializable接口?
查看>>