openCV內置畫圖函數以及畫虛線函數的實現

話不多說,直接上代碼:

#include <QCoreApplication>
#include <cv.h>
#include <highgui.h>
#include <QDebug>
#include <stdio.h>
void  drawDashRect(CvArr* img,int linelength,int dashlength,CvRect* blob,CvScalar color,int thickness);
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    IplImage* cat = cvLoadImage("D:/Pictures/cat.jpg");
    IplImage* dog = cvLoadImage("D:/Pictures/dog.jpg");
    if((cat == NULL) || (dog == NULL))
        return 1;
    qDebug() << "cat-> width = " << cat->width;
    qDebug() << "cat-> height = " <<cat->height;
    qDebug() << "dog-> width = " << dog->width;
    qDebug() << "dog-> height = " <<dog->height;
    printf("cat->widthstep = %d\n",cat->widthStep);
    printf("cat->nChannels = %d\n",cat->nChannels);
    printf("cat->depth = %d\n", cat->depth);
    printf("cat->origin = %d\n",cat->origin);
    printf("cat->dataOrder = %d\n",cat->dataOrder);
    printf("dog->widthstep = %d\n",dog->widthStep);
    printf("dog->nChannels = %d\n",dog->nChannels);
    printf("dog->depth = %d\n", dog->depth);
    printf("dog->origin = %d\n",dog->origin);
    printf("dog->dataOrder = %d\n",dog->dataOrder);
    CvRect rect1, rect2;
    //rect1 = cvScalar(100, 100, 100, 100);
    rect1.x = 300;
    rect1.y = 100;
    rect1.width = 250;
    rect1.height = 250;
    rect2.x = 400;
    rect2.y = 400;
    rect2.width = 250;
    rect2.height = 250;
    double alpha = 0.1;
    double beta = 1 - alpha;
    double gamma = 0.0;
    cvSetImageROI(cat, rect1);
    cvSetImageROI(dog, rect2);
    cvAddWeighted(cat, alpha, dog, beta, gamma, cat);
    cvResetImageROI(cat);
    //在圖上畫個矩形框
    cvRectangle(cat, cvPoint(5, 10), cvPoint(30, 40), cvScalar(201, 102, 62), 3, 4, 0 );
    //在圖上畫個橢圓(法1:直接法)
    cvEllipse(cat, cvPoint(200, 200),cvSize(84, 36),45,0,360,cvScalar(0x00, 0x00, 0xff), 3);
    //在圖上畫個橢圓(法2:外接矩形法)
    CvBox2D box;
    box.center = cvPoint2D32f(400, 200);
    box.angle = 45;
    box.size = cvSize2D32f(100, 50);
    cvEllipseBox(cat,box,cvScalar(0x00, 0xff, 0x00), 3);
    //在圖上畫個圓
    cvCircle(cat, cvPoint(300, 300),50, cvScalar(0xff, 0x00, 0x00),3);
    //在圖上打印文本
    CvFont font1;
    cvInitFont(&font1,CV_FONT_HERSHEY_SCRIPT_SIMPLEX,1,1,1,1);
    cvPutText(cat, "Hello Cat 2222",cvPoint(200, 200),&font1,cvScalar(0xff,0x00,0x00));
    //畫虛線矩形框。。。外部函數實現!!!
    CvRect rect11 = cvRect(100,200,200,100);
    drawDashRect(cat,1,2,&rect11,CV_RGB(255,0,0),1);
    cvNamedWindow("Alpha_beta", 1);
    cvMoveWindow("Alpha_beta", 500, 500);
    cvShowImage("Alpha_beta", cat);
    cvWaitKey(0);
    return a.exec();
}
void  drawDashRect(CvArr* img,int linelength,int dashlength,CvRect* blob,CvScalar color,int thickness)
{
    int w=cvRound(blob->width);//width,對一個double型的數進行四捨五入,並返回一個整型數
    int h=cvRound(blob->height);//height
    int tl_x=cvRound(blob->x);//top left x
    int tl_y=cvRound(blob->y);//top  left y
    int totallength=dashlength+linelength;
    int nCountX=w/totallength;//
    int nCountY=h/totallength;//
    CvPoint start,end;//start and end point of each dash
    //draw the horizontal lines
    start.y=tl_y;
    start.x=tl_x;
    end.x=tl_x;
    end.y=tl_y;
    for (int i=0;i<nCountX;i++)
    {
        end.x=tl_x+(i+1)*totallength-dashlength;//draw top dash line
        end.y=tl_y;
        start.x=tl_x+i*totallength;
        start.y=tl_y;
        cvLine(img,start,end,color,thickness);
    }
    for (int i=0;i<nCountX;i++)
    {
        start.x=tl_x+i*totallength;
        start.y=tl_y+h;
        end.x=tl_x+(i+1)*totallength-dashlength;//draw bottom dash line
        end.y=tl_y+h;
        cvLine(img,start,end,color,thickness);
    }
    for (int i=0;i<nCountY;i++)
    {
        start.x=tl_x;
        start.y=tl_y+i*totallength;
        end.y=tl_y+(i+1)*totallength-dashlength;//draw left dash line
        end.x=tl_x;
        cvLine(img,start,end,color,thickness);
    }
    for (int i=0;i<nCountY;i++)
    {
        start.x=tl_x+w;
        start.y=tl_y+i*totallength;
        end.y=tl_y+(i+1)*totallength-dashlength;//draw right dash line
        end.x=tl_x+w;
        cvLine(img,start,end,color,thickness);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章