void FaceDetector::run(){ CascadeClassifier cascade; if (!cascade.load("res/haarcascade_frontalface_alt.xml") ) { qDebug() << "Erreur lors du chargement du haar cascade frontalface..."; exit(0); } QSize processSize = keepAspectRatio(_image.cols, _image.rows, MAX_PROCESS_WIDTH, MAX_PROCESS_HEIGHT); Mat color; if ( _image.cols > processSize.width() ){ cv::resize( _image, color, cv::Size(processSize.width(), processSize.height() ) ); } else { color = _image.clone(); } QSize displaySize = keepAspectRatio(color.cols, color.rows); _ratio = (double) color.cols/displaySize.width(); Mat gray; cvtColor(color, gray, CV_BGR2GRAY); //PRETRAITEMENT equalizeHist(gray, gray); vector<Rect> facesRects; cascade.detectMultiScale(gray, facesRects, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cvSize(16,16)); // qDebug() << "detected faces size: " << facesRects.size(); for (unsigned int i = 0; i < facesRects.size(); ++i){ Rect r = facesRects[i]; Mat croppedFace; getRectSubPix(color, Size(r.width, r.height), Point2f(r.x + r.width/2, r.y + r.height / 2), croppedFace); // qImageFaces << Mat2QImage(croppedFace); struct DetectorData tmpData; tmpData.id = i; cv::resize( croppedFace, croppedFace, Size(WORK_SIZE,WORK_SIZE) ); tmpData.image = Mat2QImage(croppedFace); emit sendFace( tmpData.image ); tmpData.rect = QRect(r.x/_ratio+1, r.y/_ratio+1, r.width/_ratio+1, r.height/_ratio+1); tmpData.cvRect = r; tmpData.mat = croppedFace; cvtColor(croppedFace, tmpData.gray, CV_RGB2GRAY); // cv::resize( tmpData.gray, tmpData.gray, Size(WORK_SIZE,WORK_SIZE) ); detectorData << tmpData; } qRegisterMetaType< QList<struct DetectorData> >( "QList<struct DetectorData>" ); emit detectionFinished( _index, detectorData ); }
void ImageItem::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget) { ppainter->save(); if (isSelected()) ppainter->setOpacity(Const::SELECTION_OPACITY); else ppainter->setOpacity(qreal(opacity())/100); QPointF point = rect().topLeft(); QImage img; if (m_scale && !image().isNull()){ img = image().scaled(rect().width(), rect().height(), keepAspectRatio() ? Qt::KeepAspectRatio : Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } else { img = image(); } qreal shiftHeight = rect().height() - img.height(); qreal shiftWidth = rect().width() - img.width(); if (m_center){ if (shiftHeight<0 || shiftWidth<0){ qreal cutX = 0; qreal cutY = 0; qreal cutWidth = img.width(); qreal cutHeigth = img.height(); if (shiftWidth > 0){ point.setX(point.x()+shiftWidth/2); } else { cutX = abs(shiftWidth/2); cutWidth += shiftWidth; } if (shiftHeight > 0){ point.setY(point.x()+shiftHeight/2); } else { cutY = abs(shiftHeight/2); cutHeigth += shiftHeight; } img = img.copy(cutX,cutY,cutWidth,cutHeigth); } else { point.setX(point.x()+shiftWidth/2); point.setY(point.y()+shiftHeight/2); } } if (img.isNull() && itemMode()==DesignMode){ QString text; ppainter->setFont(transformToSceneFont(QFont("Arial",10))); if (!datasource().isEmpty() && !field().isEmpty()) text = datasource()+"."+field(); else text = tr("Image"); ppainter->drawText(rect().adjusted(4,4,-4,-4), Qt::AlignCenter, text ); } else { ppainter->drawImage(point,img); } ItemDesignIntf::paint(ppainter,option,widget); ppainter->restore(); }