#include "mainwidget.h"
#include <QDebug>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
this->m_vLayout=new QVBoxLayout;
this->m_hLayout=new QHBoxLayout;
this->m_btnRGB=new QToolButton;
this->m_btnRGB->setText(tr("RGB"));
connect(this->m_btnRGB,SIGNAL(clicked()),this,SLOT(ZSlot2RGB()));
this->m_btnGray=new QToolButton;
this->m_btnGray->setText(tr("Gray"));
connect(this->m_btnGray,SIGNAL(clicked()),this,SLOT(ZSlot2Gray()));
this->m_btnFindCircle=new QToolButton;
this->m_btnFindCircle->setText(tr("Recognize"));
connect(this->m_btnFindCircle,SIGNAL(clicked()),this,SLOT(ZSlotFindCircle()));
this->m_hLayout->addWidget(this->m_btnRGB);
this->m_hLayout->addWidget(this->m_btnGray);
this->m_hLayout->addWidget(this->m_btnFindCircle);
this->m_vLayout->addStretch(1);
this->m_vLayout->addLayout(this->m_hLayout);
this->setLayout(this->m_vLayout);
this->m_srcImg=cvLoadImage("/home/shell.albert/opencvtest/2.png");
if(this->m_srcImg)
{
//cvCvtColor(this->m_srcImg,this->m_srcImg,CV_BGR2RGB);
this->resize(this->m_srcImg->width+20,this->m_srcImg->height+20);
this->m_dstImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
}
this->m_imgAction=IMG_SHOW_RGB;
}
MainWidget::~MainWidget()
{
delete this->m_btnGray;
delete this->m_btnRGB;
delete this->m_btnFindCircle;
delete this->m_hLayout;
delete this->m_vLayout;
if(this->m_srcImg)
{
cvReleaseImage(&this->m_srcImg);
}
if(this->m_dstImg)
{
cvReleaseImage(&this->m_dstImg);
}
}
void MainWidget::paintEvent(QPaintEvent *event)
{
QPainter tPainter(this);
switch(this->m_imgAction)
{
case IMG_SHOW_RGB:
{
cvCvtColor(this->m_srcImg,this->m_srcImg,CV_BGR2RGB);
uchar *imgData=(uchar*)this->m_srcImg->imageData;
QImage tImage(imgData,this->m_srcImg->width,this->m_srcImg->height,this->m_srcImg->widthStep,QImage::Format_RGB888);
tPainter.drawImage(10,10,tImage);
cvCvtColor(this->m_srcImg,this->m_srcImg,CV_RGB2BGR);
}
break;
case IMG_SHOW_GRAY:
{
#if 0
cvCvtColor(this->m_srcImg,this->m_dstImg,CV_BGR2GRAY);
uchar *imgData=(uchar*)this->m_dstImg->imageData;
QImage tImage(imgData,this->m_dstImg->width,this->m_dstImg->height,this->m_dstImg->widthStep,QImage::Format_Indexed8);
QVector<QRgb> colorTable;
for(qint32 i=0;i<256;i++)
{
colorTable.append(qRgb(i,i,i));
}
tImage.setColorTable(colorTable);
tImage.setColorCount(255);
tPainter.drawImage(10,10,tImage);
#endif
IplImage *tDstImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
IplImage *tImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
cvCvtColor(this->m_srcImg,tDstImg,CV_BGR2GRAY);
cvCanny(tDstImg,tImg,50,150,3);
uchar *imgData=(uchar*)tImg->imageData;
QImage tImage(imgData,tImg->width,tImg->height,tImg->widthStep,QImage::Format_Indexed8);
QVector<QRgb> colorTable;
for(qint32 i=0;i<256;i++)
{
colorTable.append(qRgb(i,i,i));
}
tImage.setColorTable(colorTable);
tImage.setColorCount(255);
tPainter.drawImage(10,10,tImage);
cvReleaseImage(&tDstImg);
cvReleaseImage(&tImg);
}
break;
case IMG_FIND_CIRCLE:
{
//step 1:BGR to Gray.
cvCvtColor(this->m_srcImg,this->m_dstImg,CV_BGR2GRAY);
CvMemStorage *storage=cvCreateMemStorage(0);
//cvSmooth(dstImg,dstImg,CV_GAUSSIAN,5,5);
CvSeq *circles=cvHoughCircles(this->m_dstImg,storage,CV_HOUGH_GRADIENT,2,this->m_dstImg->width/3,300,100,0,200);
IplImage *color=cvCreateImage(cvGetSize(this->m_dstImg),IPL_DEPTH_8U,3);
cvCvtColor(this->m_dstImg,color,CV_GRAY2RGB);
printf("circle total=%d\n",circles->total);
for(int i=0;i<circles->total;i++)
{
float *p=(float*)cvGetSeqElem(circles,i);
float tX=p[0];
float tY=p[1];
float tRadius=p[2];
//the destination is on the right side
//so here we ignore the left.
if(tX<this->m_srcImg->width/2)
{
qDebug()<<"bypass left side";
continue;
}
//draw a circle to wrap it.
CvPoint pt=cvPoint(cvRound(p[0]),cvRound(p[1]));
cvCircle(color,pt,cvRound(p[2]),CV_RGB(255,0,0),3,8,0);
//draw a 10x10 rectangle aroud circle center.
CvPoint pt1=pt;
CvPoint pt2=pt;
pt1.x-=5;
pt1.y-=5;
pt2.x+=5;
pt2.y+=5;
cvRectangle(color,pt1,pt2,cvScalar(255,0,0,0),3);
//draw text.
CvPoint txtPt=pt;
txtPt.y-=40;
txtPt.x-=60;
const char *txtInfo="fint it!";
CvFont tFont=cvFont(3.0,3);
cvPutText(color,txtInfo,txtPt,&tFont,cvScalar(255,255,0));
}
//step3.display it.
uchar *imgData=(uchar*)color->imageData;
QImage tImage(imgData,color->width,color->height,color->widthStep,QImage::Format_RGB888);
tPainter.drawImage(10,10,tImage);
cvReleaseImage(&color);
}
break;
default:
break;
}
}
void MainWidget::ZSlot2RGB()
{
this->m_imgAction=IMG_SHOW_RGB;
this->update();
}
void MainWidget::ZSlot2Gray()
{
this->m_imgAction=IMG_SHOW_GRAY;
this->update();
}
void MainWidget::ZSlotFindCircle()
{
this->m_imgAction=IMG_FIND_CIRCLE;
this->update();
}
#include <QDebug>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
this->m_vLayout=new QVBoxLayout;
this->m_hLayout=new QHBoxLayout;
this->m_btnRGB=new QToolButton;
this->m_btnRGB->setText(tr("RGB"));
connect(this->m_btnRGB,SIGNAL(clicked()),this,SLOT(ZSlot2RGB()));
this->m_btnGray=new QToolButton;
this->m_btnGray->setText(tr("Gray"));
connect(this->m_btnGray,SIGNAL(clicked()),this,SLOT(ZSlot2Gray()));
this->m_btnFindCircle=new QToolButton;
this->m_btnFindCircle->setText(tr("Recognize"));
connect(this->m_btnFindCircle,SIGNAL(clicked()),this,SLOT(ZSlotFindCircle()));
this->m_hLayout->addWidget(this->m_btnRGB);
this->m_hLayout->addWidget(this->m_btnGray);
this->m_hLayout->addWidget(this->m_btnFindCircle);
this->m_vLayout->addStretch(1);
this->m_vLayout->addLayout(this->m_hLayout);
this->setLayout(this->m_vLayout);
this->m_srcImg=cvLoadImage("/home/shell.albert/opencvtest/2.png");
if(this->m_srcImg)
{
//cvCvtColor(this->m_srcImg,this->m_srcImg,CV_BGR2RGB);
this->resize(this->m_srcImg->width+20,this->m_srcImg->height+20);
this->m_dstImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
}
this->m_imgAction=IMG_SHOW_RGB;
}
MainWidget::~MainWidget()
{
delete this->m_btnGray;
delete this->m_btnRGB;
delete this->m_btnFindCircle;
delete this->m_hLayout;
delete this->m_vLayout;
if(this->m_srcImg)
{
cvReleaseImage(&this->m_srcImg);
}
if(this->m_dstImg)
{
cvReleaseImage(&this->m_dstImg);
}
}
void MainWidget::paintEvent(QPaintEvent *event)
{
QPainter tPainter(this);
switch(this->m_imgAction)
{
case IMG_SHOW_RGB:
{
cvCvtColor(this->m_srcImg,this->m_srcImg,CV_BGR2RGB);
uchar *imgData=(uchar*)this->m_srcImg->imageData;
QImage tImage(imgData,this->m_srcImg->width,this->m_srcImg->height,this->m_srcImg->widthStep,QImage::Format_RGB888);
tPainter.drawImage(10,10,tImage);
cvCvtColor(this->m_srcImg,this->m_srcImg,CV_RGB2BGR);
}
break;
case IMG_SHOW_GRAY:
{
#if 0
cvCvtColor(this->m_srcImg,this->m_dstImg,CV_BGR2GRAY);
uchar *imgData=(uchar*)this->m_dstImg->imageData;
QImage tImage(imgData,this->m_dstImg->width,this->m_dstImg->height,this->m_dstImg->widthStep,QImage::Format_Indexed8);
QVector<QRgb> colorTable;
for(qint32 i=0;i<256;i++)
{
colorTable.append(qRgb(i,i,i));
}
tImage.setColorTable(colorTable);
tImage.setColorCount(255);
tPainter.drawImage(10,10,tImage);
#endif
IplImage *tDstImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
IplImage *tImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
cvCvtColor(this->m_srcImg,tDstImg,CV_BGR2GRAY);
cvCanny(tDstImg,tImg,50,150,3);
uchar *imgData=(uchar*)tImg->imageData;
QImage tImage(imgData,tImg->width,tImg->height,tImg->widthStep,QImage::Format_Indexed8);
QVector<QRgb> colorTable;
for(qint32 i=0;i<256;i++)
{
colorTable.append(qRgb(i,i,i));
}
tImage.setColorTable(colorTable);
tImage.setColorCount(255);
tPainter.drawImage(10,10,tImage);
cvReleaseImage(&tDstImg);
cvReleaseImage(&tImg);
}
break;
case IMG_FIND_CIRCLE:
{
//step 1:BGR to Gray.
cvCvtColor(this->m_srcImg,this->m_dstImg,CV_BGR2GRAY);
CvMemStorage *storage=cvCreateMemStorage(0);
//cvSmooth(dstImg,dstImg,CV_GAUSSIAN,5,5);
CvSeq *circles=cvHoughCircles(this->m_dstImg,storage,CV_HOUGH_GRADIENT,2,this->m_dstImg->width/3,300,100,0,200);
IplImage *color=cvCreateImage(cvGetSize(this->m_dstImg),IPL_DEPTH_8U,3);
cvCvtColor(this->m_dstImg,color,CV_GRAY2RGB);
printf("circle total=%d\n",circles->total);
for(int i=0;i<circles->total;i++)
{
float *p=(float*)cvGetSeqElem(circles,i);
float tX=p[0];
float tY=p[1];
float tRadius=p[2];
//the destination is on the right side
//so here we ignore the left.
if(tX<this->m_srcImg->width/2)
{
qDebug()<<"bypass left side";
continue;
}
//draw a circle to wrap it.
CvPoint pt=cvPoint(cvRound(p[0]),cvRound(p[1]));
cvCircle(color,pt,cvRound(p[2]),CV_RGB(255,0,0),3,8,0);
//draw a 10x10 rectangle aroud circle center.
CvPoint pt1=pt;
CvPoint pt2=pt;
pt1.x-=5;
pt1.y-=5;
pt2.x+=5;
pt2.y+=5;
cvRectangle(color,pt1,pt2,cvScalar(255,0,0,0),3);
//draw text.
CvPoint txtPt=pt;
txtPt.y-=40;
txtPt.x-=60;
const char *txtInfo="fint it!";
CvFont tFont=cvFont(3.0,3);
cvPutText(color,txtInfo,txtPt,&tFont,cvScalar(255,255,0));
}
//step3.display it.
uchar *imgData=(uchar*)color->imageData;
QImage tImage(imgData,color->width,color->height,color->widthStep,QImage::Format_RGB888);
tPainter.drawImage(10,10,tImage);
cvReleaseImage(&color);
}
break;
default:
break;
}
}
void MainWidget::ZSlot2RGB()
{
this->m_imgAction=IMG_SHOW_RGB;
this->update();
}
void MainWidget::ZSlot2Gray()
{
this->m_imgAction=IMG_SHOW_GRAY;
this->update();
}
void MainWidget::ZSlotFindCircle()
{
this->m_imgAction=IMG_FIND_CIRCLE;
this->update();
}