話不多說,直接上代碼:
#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);
}
}