【OpenCV画图】

【OpenCV画图】

各函数


demo代码

#include<bits/stdc++.h>
#include<opencv2/opencv.hpp>
using namespace std;
#define WINDOW_NAME1 "【绘制图1】"
#define WINDOW_NAME2 "【绘制图2】"
#define WINDOW_WIDTH 600
//画椭圆
void DrawEllipse(cv::Mat img,double angle){
    int thickness=2;
    int lineType=8;

    cv::ellipse(img,cv::Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2),cv::Size(WINDOW_WIDTH/4,WINDOW_WIDTH/16),
                angle,0,360,cv::Scalar(255,129,0),thickness,lineType);

}
//实心圆
void DrawFilledCircle(cv::Mat img,cv::Point center){
    int thickness=-1;//线粗为-1:实心
    int lineType=8;

    cv::circle(img,center,WINDOW_WIDTH/32,cv::Scalar(0,0,255),thickness,lineType);
}
//凹多边形
void DrawPolygon(cv::Mat img){
    int lineType=8;
    //创建一些点
    cv::Point rookPoints[1][20];
    rookPoints[0][0]=cv::Point(WINDOW_WIDTH/4,7*WINDOW_WIDTH/8);
    rookPoints[0][1]=cv::Point(3*WINDOW_WIDTH/4,7*WINDOW_WIDTH/8);
    rookPoints[0][2]=cv::Point(3*WINDOW_WIDTH/4,13*WINDOW_WIDTH/16);
    rookPoints[0][3]=cv::Point(11*WINDOW_WIDTH/16,13*WINDOW_WIDTH/16);
    rookPoints[0][4]=cv::Point(19*WINDOW_WIDTH/32,3*WINDOW_WIDTH/8);
    rookPoints[0][5]=cv::Point(3*WINDOW_WIDTH/4,13*WINDOW_WIDTH/8);
    rookPoints[0][6]=cv::Point(3*WINDOW_WIDTH/4,WINDOW_WIDTH/8);
    rookPoints[0][7]=cv::Point(26*WINDOW_WIDTH/40,WINDOW_WIDTH/8);
    rookPoints[0][8]=cv::Point(26*WINDOW_WIDTH/40,WINDOW_WIDTH/4);
    rookPoints[0][9]=cv::Point(22*WINDOW_WIDTH/40,WINDOW_WIDTH/4);
    rookPoints[0][10]=cv::Point(22*WINDOW_WIDTH/40,WINDOW_WIDTH/8);
    rookPoints[0][11]=cv::Point(18*WINDOW_WIDTH/40,WINDOW_WIDTH/8);
    rookPoints[0][12]=cv::Point(18*WINDOW_WIDTH/40,WINDOW_WIDTH/4);
    rookPoints[0][13]=cv::Point(14*WINDOW_WIDTH/40,WINDOW_WIDTH/4);
    rookPoints[0][14]=cv::Point(14*WINDOW_WIDTH/40,WINDOW_WIDTH/8);
    rookPoints[0][15]=cv::Point(WINDOW_WIDTH/4,WINDOW_WIDTH/8);
    rookPoints[0][16]=cv::Point(WINDOW_WIDTH/4,3*WINDOW_WIDTH/8);
    rookPoints[0][17]=cv::Point(13*WINDOW_WIDTH/32,3*WINDOW_WIDTH/8);
    rookPoints[0][18]=cv::Point(5*WINDOW_WIDTH/16,13*WINDOW_WIDTH/16);
    rookPoints[0][19]=cv::Point(WINDOW_WIDTH/4,13*WINDOW_WIDTH/16);

    const cv::Point *ppt[1]={rookPoints[0]};
    int npt[]={20};
    //将多边形画到图像上
    cv::fillPoly(img,ppt,npt,1,cv::Scalar(255,255,255),lineType);
}
//画线
void DrawLine(cv::Mat img,cv::Point start,cv::Point end){
    int thickness=2;
    int lineType=8;
    cv::line(img,start,end,cv::Scalar(0,0,0),thickness,lineType);
}
int main(){
    cv::Mat atomImage=cv::Mat::zeros(WINDOW_WIDTH,WINDOW_WIDTH,CV_8UC3);
    cv::Mat rookImage=cv::Mat::zeros(WINDOW_WIDTH,WINDOW_WIDTH,CV_8UC3);

    //第一副图
    DrawEllipse(atomImage,90);
    DrawEllipse(atomImage,0);
    DrawEllipse(atomImage,45);
    DrawEllipse(atomImage,-45);

    DrawFilledCircle(atomImage,cv::Point(WINDOW_WIDTH/2,WINDOW_WIDTH/2));

    //第二副图
    DrawPolygon(rookImage);

    cv::rectangle(rookImage,cv::Point(0,7*WINDOW_WIDTH/8),cv::Point(WINDOW_WIDTH,WINDOW_WIDTH),cv::Scalar(0,255,255),-1,8);

    //绘制线段
    DrawLine(rookImage,cv::Point(0,15*WINDOW_WIDTH/16),cv::Point(WINDOW_WIDTH,15*WINDOW_WIDTH/16));
    DrawLine(rookImage,cv::Point(WINDOW_WIDTH/4,7*WINDOW_WIDTH/8),cv::Point(WINDOW_WIDTH/4,WINDOW_WIDTH));
    DrawLine(rookImage,cv::Point(WINDOW_WIDTH/2,7*WINDOW_WIDTH/8),cv::Point(WINDOW_WIDTH/2,WINDOW_WIDTH));
    DrawLine(rookImage,cv::Point(3*WINDOW_WIDTH/4,7*WINDOW_WIDTH/8),cv::Point(3*WINDOW_WIDTH/4,WINDOW_WIDTH));

    cv::imshow(WINDOW_NAME1,atomImage);
    cv::moveWindow(WINDOW_NAME1,0,200);
    cv::imshow(WINDOW_NAME2,rookImage);
    cv::moveWindow(WINDOW_NAME2,WINDOW_WIDTH,200);

    cv::waitKey(0);
    return 0;
}
posted @ 2025-03-21 06:29  White_ink  阅读(11)  评论(0)    收藏  举报