其原因在主线程GUI中不宜采用sleep()等函数,否则会出现意想不到的结果。
如果需要延时,#include后,可以用下面的代码(比如说延时1s):
QElapsedTimert;
t.start();
while(t.elapsed()<1000)
QcoreApplication:
:
processEvents();
3.fillPoly函数的第2个参数是指1个指向Point的双指针,因为该函数可以同时填充多个多边形。
第3个参数为指向整型的指针,表示每个多边形中顶点的个数。
实验结果:
画atom图过程之一及其结果:
画rook图过程之一及其结果:
实验主要部分代码及注释(附录有工程code下载链接):
#include"mainwindow.h"
#include"ui_mainwindow.h"
//#include
//#include
#include
#include
usingnamespacestd;
MainWindow:
:
MainWindow(QWidget*parent):
QMainWindow(parent),
ui(newUi:
:
MainWindow)
{
ui->setupUi(this);
ui->textBrowser->setFixedWidth(W);
ui->textBrowser->setFixedHeight(W);
}
MainWindow:
:
~MainWindow()
{
deleteui;
}
voidMainWindow:
:
on_closeButton_clicked()
{
close();
}
voidMainWindow:
:
on_drawing1Button_clicked()
{
/*画图1,资料中称该图为atom*/
img=Mat:
:
zeros(W,W,CV_8UC3);
imwrite("../drawing/drawing.jpg",img);
ui->textBrowser->insertHtml("");
/*下面几句为在Qt中常用的延时函数,这里为延时1s,注意主线程中不要采用sleep()等函数
否则会出现意想不到的结果*/
QElapsedTimert;
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
/*画椭圆1*/
ui->textBrowser->clear();
my_ellipse(img,0);
imwrite("../drawing/drawing1.jpg",img);
ui->textBrowser->append("");
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
/*画椭圆2*/
ui->textBrowser->clear();
my_ellipse(img,90);
imwrite("../drawing/drawing2.jpg",img);
ui->textBrowser->append("");
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
/*画椭圆3*/
ui->textBrowser->clear();
my_ellipse(img,45);
imwrite("../drawing/drawing3.jpg",img);
ui->textBrowser->append("");
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
/*画椭圆4*/
ui->textBrowser->clear();
my_ellipse(img,135);
imwrite("../drawing/drawing3.jpg",img);
ui->textBrowser->append("");
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
/*画atom的中心实心圆*/
ui->textBrowser->clear();
my_filled_circle(img,Point(W/2,W/2));
imwrite("../drawing/drawing3.jpg",img);
ui->textBrowser->append("");
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
}
voidMainWindow:
:
on_drawing2Button_clicked()
{
/*画图2,资料中称该图为rook,其实就是一枚国际像棋子*/
img=Mat:
:
zeros(W,W,CV_8UC3);
imwrite("../drawing/drawing.jpg",img);
ui->textBrowser->insertHtml("");
QElapsedTimert;
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
ui->textBrowser->clear();
my_polygon(img);
imwrite("../drawing/drawing2.jpg",img);
ui->textBrowser->append("");
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
ui->textBrowser->clear();
rectangle(img,Rect(Point(0,7*W/8),Point(W,W)),Scalar(0,0,255),-1,8);
imwrite("../drawing/drawing2.jpg",img);
ui->textBrowser->append("");
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
ui->textBrowser->clear();
my_line(img,Point(0,15*W/16),Point(W,15*W/16));
my_line(img,Point(W/4,W/8),Point(W/4,W));
my_line(img,Point(W/2,7*W/8),Point(W/2,W));
my_line(img,Point(3*W/4,W/8),Point(3*W/4,W));
imwrite("../drawing/drawing2.jpg",img);
ui->textBrowser->append("");
t.start();
while(t.elapsed()<1000)
QCoreApplication:
:
processEvents();
}
voidMainWindow:
:
my_ellipse(Mat&img,floatangle)
{
cv:
:
ellipse(img,Point(W/2,W/2),Size(3*W/8,W/8),angle,0,360,Scalar(0,255,0),2,8);
}
voidMainWindow:
:
my_filled_circle(Mat&img,Pointcenter)
{
cv:
:
circle(img,center,W/8,Scalar(0,0,255),-1,8);
}
voidMainWindow:
:
my_polygon(Mat&img)
{
intncontours=1;
Pointrook_points[1][20];
rook_points[0][0]=Point(W/4.0,7*W/8.0);
rook_points[0][1]=Point(3*W/4.0,7*W/8.0);
rook_points[0][2]=Point(3*W/4.0,13*W/16.0);
rook_points[0][3]=Point(11*W/16.0,13*W/16.0);
rook_points[0][4]=Point(19*W/32.0,3*W/8.0);
rook_points[0][5]=Point(3*W/4.0,3*W/8.0);
rook_points[0][6]=Point(3*W/4.0,W/8.0);
rook_points[0][7]=Point(26*W/40.0,W/8.0);
rook_points[0][8]=Point(26*W/40.0,W/4.0);
rook_points[0][9]=Point(22*W/40.0,W/4.0);
rook_points[0][10]=Point(22*W/40.0,W/8.0);
rook_points[0][11]=Point(18*W/40.0,W/8.0);
rook_points[0][12]=Point(18*W/40.0,W/4.0);
rook_points[0][13]=Point(14*W/40.0,W/4.0);
rook_points[0][14]=Point(14*W/40.0,W/8.0);
rook_points[0][15]=Point(W/4.0,W/8.0);
rook_points[0][16]=Point(W/4.0,3*W/8.0);
rook_points[0][17]=Point(13*W/32.0,3*W/8.0);
rook_points[0][18]=Point(5*W/16.0,13*W/16.0);
rook_points[0][19]=Point(W/4.0,13*W/16.0);
constPoint*pts[1]={rook_points[0]};
//constPoint**pts=rook_points;//这样定义是不行的,因为rook_points是个常量的二阶指针
intnpts[1]={20};
//用指定颜色填充指定闭合的多边形。
fillPoly(img,pts,npts,ncontours,Scalar(0,255,0),8);
}
voidMainWindow:
:
my_line(Mat&img,Pointstart,Pointend)
{
line(img,start,end,Scalar(0,0,0),2,8);
}
实验总结:
本次实验的主要时间花在了延时函数的使用上,因为不同操作系统的内核不同,所以使用延时函数时需要小心,一开始使用的延时函数usleep(),总出现莫名其妙的现象,后面在论坛上得到了网友的指点说GUI线程中最好不要使用sleep()系列的函数。