7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列


本文作者:小嗷

微信公众号:aoxiaoji

链接:https://www.jianshu.com/u/45da1fbce7d0

关键词:基本图形的绘制


image
7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第1张图片
image
image
  1. 点的表示:Point类 (用点来表示找到特征点)

  2. 颜色的表示:Scalar类(设置颜色)

  3. 尺寸的表示:Size类(测距用到)

  4. 矩阵的表示:Rect类(ROI经常用到)

  5. 圆的表示:circle函数(用圆来绘制出识别出来物体的区域)

  6. 矩形的表示:rectangle函数(用矩形来绘制出识别出来物体的区域)

  7. 直线的表示:line函数(比对两张图片特征点时,需要有line连在一起,方便观看)

  8. 还有多边形的fillPoly函数和椭圆elipse函数(眼睛识别)

image

3.1 Point(点)

Point(int x, int y) //初中数学平面图 X,Y轴上的两个坐标
Point pt1(20,30);
Point pt2;
pt2.x = 20;
pt2.y = 30;

3.2 Size(尺寸)

Size(int width, int height) //1.宽 2.高
Size size1(150, 100);
Size size2;
size2.width = 150;
size2.height = 100;
int myArea = size2.area();

尺寸類別,成員有width和height,分別表示寬和長(int型態),可用area()函式得到面積

3.3 Scalar(颜色)

  1. Scalar(a, b, c):省略透明通道,由於OpenCV的彩色影像通常為BGR的順序,a代表藍色、b代表綠色、c代表紅色。

  2. Scalar(a):通常用於灰階圖,像素強度為a。

3.4 Line(线)

C++: 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 – 线条颜色.

  5. thickness – 线条宽度.

  6. lineType – 线型

  7. Type of the line: 8 (or omitted) - 8-连接线. (4 - 4-连接线.)(CV_AA - 反走样线条.)

  8. shift – 坐标点小数点位数.

用途:特征点匹配

7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第2张图片
image

3.4 Rectangle(矩形)

C++: void rectangle(Mat& img,Point pt1, Pointpt2, const Scalar&color, intthickness=1,intlineType=8, intshift=0)

C++: void rectangle(Mat& img,Rect rec, const Scalar&color, intthickness=1, intlineType=8,intshift=0 )

参数

  1. img – 画矩形的对象

  2. pt1 – 矩形的一个顶点,左上角的.

  3. pt2 – 另一个顶点,右下角的.

  4. rec – 确定矩形的另一种方式,给左上角坐标和长宽

  5. color – 指定矩形的颜色或亮度(灰度图像),scalar(255,0,255)既可指定.

  6. thickness – 矩形边框的粗细. 负值(like CV_FILLED)表示要画一个填充的矩形

  7. lineType – 边框线型. ( 8 (or 0) - 8-connected line(8邻接)连接线。4 - 4-connected line(4邻接)连接线。CV_AA - antialiased 线条。)

  8. shift –坐标点的小数点位数

用途:用矩形来绘制出识别出来物体的区域

7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第3张图片
image

3.5 FillPoly(多边形)

C++: void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours,CvScalar color, int line_type=8, int shift=0 );

参数

  1. img – 画多边形的图像(对象)

  2. pts – 指向多边形的数组指针。

  3. npts – 多边形的顶点个数的数组。

  4. contours – 组成填充区域的线段的数量。

  5. color – 指定多边形的颜色或亮度(灰度图像),scalar(255,0,255)既可指定.

  6. lineType – 边框线型. ( 8 (or 0) - 8-connected line(8邻接)连接线。4 - 4-connected line(4邻接)连接线。CV_AA - antialiased 线条。)

  7. shift –坐标点的小数点位数

用途:用多边形来绘制出识别出来眼睛的区域

7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第4张图片
image

3.6 circle (圆)

C++: void circle(Mat&img, Point center, intradius, const Scalar&color,intthickness=1, intlineType=8, intshift=0)

参数

  1. img – 要画圆的图像(对象).

  2. center – 圆心坐标.

  3. radius – 半径.

  4. color – 圆边框颜色,scalar类型的

  5. thickness – 正值表示圆边框宽度. 负值表示画一个填充圆形

  6. lineType – 圆边框线型

  7. shift –坐标点的小数点位数

用途:用圆来绘制出识别出来眼睛的区域

7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第5张图片
image

3.7 Ellipse (椭圆)

C++: 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)

C++: void ellipse(Mat& img, constRotatedRect& box, const Scalar& color, int thickness=1, int lineType=8)

参数

  1. img – 椭圆所在图像.

  2. center – 椭圆中心.

  3. axes – 椭圆主轴一半的长度

  4. angle – 椭圆旋转角度

  5. startAngle – 椭圆弧起始角度

  6. endAngle –椭圆弧终止角度

  7. box – 指定椭圆中心和旋转角度的信息,通过 RotatedRect 或 CvBox2D. 这表示椭圆画在旋转矩形上(矩形是不可见的,只是指定了一个框而已)

  8. color – 椭圆边框颜色.

  9. thickness – 正值代表椭圆边框宽度,负值代表填充的椭圆

  10. lineType – 线型

  11. shift – 椭圆中心坐标和坐标轴的小数点位数

用途:用椭圆来绘制出识别出来椭圆物体的区域

7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第6张图片
image

3.8 PutText(显示文字)

C++: void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )

参数

  1. img – 显示文字所在图像.

  2. text – 待显示的文字.

  3. org – 文字在图像中的左下角 坐标.

  4. font – 字体结构体.

  5. fontFace – 字体类型,可选择字体(FONTHERSHEYSIMPLEX,FONTHERSHEYPLAIN, FONTHERSHEYDUPLEX,FONTHERSHEYCOMPLEX,FONTHERSHEYTRIPLEX, FONTHERSHEYCOMPLEXSMALL,FONTHERSHEYSCRIPTSIMPLEX, or FONTHERSHEYSCRIPTCOMPLEX,以上所有类型都可以配合 FONTHERSHEY_ITALIC使用,产生斜体效果。)

  6. color – 文本颜色

  7. thickness – 写字的线的粗细

  8. lineType – 线型.

  9. bottomLeftOrigin – true, 图像数据原点在左下角. Otherwise, 图像数据原点在左上角.

用途:这个经常用来显示你是谁?你多少岁?它是什么?

7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第7张图片
image
image
7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第8张图片
image
7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第9张图片
image
//---------------------------------【头文件、命名空间包含部分】----------------------------
//          描述:包含程序所使用的头文件和命名空间
//      这个例子来源opencv官网,不过我还是建议你的敲敲代码,毕竟以后识别会用到
//------------------------------------------------------------------------------------------------
#include 
#include 
// 此程序对于OpenCV3版需要额外包含头文件
#include

//-----------------------------------【宏定义部分】-------------------------------------------- 
//      描述:定义一些辅助宏 
//------------------------------------------------------------------------------------------------ 
#define WINDOW_NAME1 "基本图形的绘制图1"    //为窗口标题定义的宏
#define WINDOW_NAME2 "基本图形的绘制图2"    //为窗口标题定义的宏
#define WINDOW_WIDTH 600    //定义窗口宽度 600

using namespace cv;
//--------------------------------【全局函数声明部分】-------------------------------------
//      描述:全局函数声明(相当于java中主类的方法),进一步封装API
//-----------------------------------------------------------------------------------------------
void DrawEllipse(Mat img,double angle);//绘制椭圆
void DrawFilledCircle(Mat img, Point center);//绘制圆
void DrawPolygon(Mat img);//绘制多边形
void DrawLine(Mat img,Point start,Point end);//绘制线段

                                             //---------------------------------------【main( )函数】--------------------------------------
                                             //     描述:控制台应用程序的入口函数,我们的程序从这里开始执行
                                             //-----------------------------------------------------------------------------------------------
int main(void)
{

    // 创建空白的Mat图像
    Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
    Mat rookImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);

    // ---------------------<1>绘制化学中的原子示例图------------------------

    //【1.1】先绘制出椭圆
    DrawEllipse(atomImage, 90);
    DrawEllipse(atomImage, 0);
    DrawEllipse(atomImage, 45);
    DrawEllipse(atomImage, -45);

    //【1.2】再绘制圆心
    DrawFilledCircle(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2));

    // ----------------------------<2>绘制组合图-----------------------------
    //【2.1】先绘制出椭圆
    DrawPolygon(rookImage);

    // 【2.2】绘制矩形
    rectangle(rookImage,
        Point(0, 7 * WINDOW_WIDTH / 8),
        Point(WINDOW_WIDTH, WINDOW_WIDTH),
        Scalar(0, 255, 255),
        -1,
        8);

    // 【2.3】绘制一些线段
    DrawLine(rookImage, Point(0, 15 * WINDOW_WIDTH / 16), Point(WINDOW_WIDTH, 15 * WINDOW_WIDTH / 16));
    DrawLine(rookImage, Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 4, WINDOW_WIDTH));
    DrawLine(rookImage, Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));
    DrawLine(rookImage, Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH));

    // ---------------------------<3>显示绘制出的图像------------------------
    imshow(WINDOW_NAME1, atomImage);
    moveWindow(WINDOW_NAME1, 0, 200);
    imshow(WINDOW_NAME2, rookImage);
    moveWindow(WINDOW_NAME2, WINDOW_WIDTH, 200);

    waitKey(0);
    return(0);
}

//-------------------------------【DrawEllipse( )函数】--------------------------------
//      描述:自定义的绘制函数,实现了绘制不同角度、相同尺寸的椭圆
//-----------------------------------------------------------------------------------------
void DrawEllipse(Mat img, double angle)
{
    int thickness = 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),
        thickness,
        lineType);
}

//-----------------------------------【DrawFilledCircle( )函数】---------------------------
//      描述:自定义的绘制函数,实现了实心圆的绘制
//-----------------------------------------------------------------------------------------
void DrawFilledCircle(Mat img, Point center)
{
    int thickness = -1;
    int lineType = 8;

    circle(img,
        center,
        WINDOW_WIDTH / 32,
        Scalar(0, 0, 255),
        thickness,
        lineType);
}

//-----------------------------------【DrawPolygon( )函数】--------------------------
//      描述:自定义的绘制函数,实现了凹多边形的绘制
//--------------------------------------------------------------------------------------
void DrawPolygon(Mat img)
{
    int lineType = 8;

    //创建一些点
    Point rookPoints[1][20];
    rookPoints[0][0] = Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
    rookPoints[0][1] = Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
    rookPoints[0][2] = Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
    rookPoints[0][3] = Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
    rookPoints[0][4] = Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
    rookPoints[0][5] = Point(3 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
    rookPoints[0][6] = Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
    rookPoints[0][7] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rookPoints[0][8] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rookPoints[0][9] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rookPoints[0][10] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rookPoints[0][11] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rookPoints[0][12] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rookPoints[0][13] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rookPoints[0][14] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rookPoints[0][15] = Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
    rookPoints[0][16] = Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
    rookPoints[0][17] = Point(13 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
    rookPoints[0][18] = Point(5 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
    rookPoints[0][19] = Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);

    const Point* ppt[1] = { rookPoints[0] };
    int npt[] = { 20 };

    fillPoly(img,
        ppt,
        npt,
        1,
        Scalar(255, 255, 255),
        lineType);
}

//-----------------------------------【DrawLine( )函数】--------------------------
//      描述:自定义的绘制函数,实现了线的绘制
//---------------------------------------------------------------------------------
void DrawLine(Mat img, Point start, Point end)
{
    int thickness = 2;
    int lineType = 8;
    line(img,
        start,
        end,
        Scalar(0, 0, 0),
        thickness,
        lineType);
}
7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第10张图片
image
image
  1. 本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)

  2. 大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年

  3. 写文章主要是为了后人少走点弯路,多交点朋友,一起学习

  4. 如果有好的图像识别群拉我进去QQ:631821577

  5. 就我一个白板,最后还是成的,你们别怕,慢慢来把

7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列_第11张图片
image

分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。

  • 邮箱:[email protected]

  • QQ群:736854977

  • 有什么疑问公众号提问,下班或者周六日回答,ths

你可能感兴趣的:(7.图像识别后的目标区域的绘制(基本图形的绘制) --- OpenCV从零开始到图像(人脸 + 物体)识别系列)