本文共 4632 字,大约阅读时间需要 15 分钟。
#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(); }转载地址:http://bczji.baihongyu.com/