美文网首页
7.图像识别后的目标区域的绘制(基本图形的绘制) --- Ope

7.图像识别后的目标区域的绘制(基本图形的绘制) --- Ope

作者: 小嗷_a2e2 | 来源:发表于2018-05-20 14:55 被阅读369次

    本文作者:小嗷

    微信公众号:aoxiaoji

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

    关键词:基本图形的绘制


    image 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 – 坐标点小数点位数.

    用途:特征点匹配

    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 –坐标点的小数点位数

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

    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 –坐标点的小数点位数

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

    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 –坐标点的小数点位数

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

    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 – 椭圆中心坐标和坐标轴的小数点位数

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

    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, 图像数据原点在左上角.

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

    image image image image
    //---------------------------------【头文件、命名空间包含部分】----------------------------
    //          描述:包含程序所使用的头文件和命名空间
    //      这个例子来源opencv官网,不过我还是建议你的敲敲代码,毕竟以后识别会用到
    //------------------------------------------------------------------------------------------------
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    // 此程序对于OpenCV3版需要额外包含头文件
    #include<opencv2/imgproc/imgproc.hpp>
    
    //-----------------------------------【宏定义部分】-------------------------------------------- 
    //      描述:定义一些辅助宏 
    //------------------------------------------------------------------------------------------------ 
    #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);
    }
    
    image image
    1. 本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)

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

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

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

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

    image

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

    • 邮箱:631821577@qq.com

    • QQ群:736854977

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

    相关文章

      网友评论

          本文标题:7.图像识别后的目标区域的绘制(基本图形的绘制) --- Ope

          本文链接:https://www.haomeiwen.com/subject/kvhtjftx.html