cv::Mat extract_region(const cv::Mat& m, const cv::RotatedRect& ir, bool flipped, int interpolation, int bordertype, int value){ cv::Mat M, enlarged, rotated, cropped; cv::Rect margins; cv::RotatedRect pos_in_enlarged; boost::tie(margins,pos_in_enlarged) = required_padding(m, ir); cv::copyMakeBorder(m, enlarged, margins.y, margins.height, margins.x, margins.width, bordertype, value); cv::Size rect_size = pos_in_enlarged.size; float angle = pos_in_enlarged.angle; if(angle == 0.){ cv::Rect rr( pos_in_enlarged.center.x - pos_in_enlarged.size.width/2, pos_in_enlarged.center.y - pos_in_enlarged.size.height/2, pos_in_enlarged.size.width, pos_in_enlarged.size.height); cropped = enlarged(rr); } else{ if (pos_in_enlarged.angle < -45.) { angle += 90.0; std::swap(rect_size.width, rect_size.height); } M = cv::getRotationMatrix2D(pos_in_enlarged.center, angle, 1.0); cv::warpAffine(enlarged, rotated, M, enlarged.size(), interpolation); cv::getRectSubPix(rotated, rect_size, pos_in_enlarged.center, cropped); assert(cropped.rows == cropped.cols); } if(flipped) cv::flip(cropped, cropped, 1); if(!cropped.isContinuous()) cropped = cropped.clone(); return cropped; }
void QgsSizeScaleWidget::updatePreview() { if ( !mSymbol || !mLayer ) return; QScopedPointer<QgsScaleExpression> expr( createExpression() ); QList<double> breaks = QgsSymbolLayerV2Utils::prettyBreaks( expr->minValue(), expr->maxValue(), 4 ); treeView->setIconSize( QSize( 512, 512 ) ); mPreviewList.clear(); int widthMax = 0; for ( int i = 0; i < breaks.length(); i++ ) { QScopedPointer< QgsMarkerSymbolV2 > symbol( dynamic_cast<QgsMarkerSymbolV2*>( mSymbol->clone() ) ); symbol->setDataDefinedSize( QgsDataDefined() ); symbol->setDataDefinedAngle( QgsDataDefined() ); // to avoid symbol not beeing drawn symbol->setSize( expr->size( breaks[i] ) ); QgsSymbolV2LegendNode node( mLayerTreeLayer, QgsLegendSymbolItemV2( symbol.data(), QString::number( i ), 0 ) ); const QSize sz( node.minimumIconSize() ); node.setIconSize( sz ); QScopedPointer< QStandardItem > item( new QStandardItem( node.data( Qt::DecorationRole ).value<QPixmap>(), QString::number( breaks[i] ) ) ); widthMax = qMax( sz.width(), widthMax ); mPreviewList.appendRow( item.take() ); } // center icon and align text left by giving icons the same width // @todo maybe add some space so that icons don't touch for ( int i = 0; i < breaks.length(); i++ ) { QPixmap img( mPreviewList.item( i )->icon().pixmap( mPreviewList.item( i )->icon().actualSize( QSize( 512, 512 ) ) ) ); QPixmap enlarged( widthMax, img.height() ); // fill transparent and add original image enlarged.fill( Qt::transparent ); QPainter p( &enlarged ); p.drawPixmap( QPoint(( widthMax - img.width() ) / 2, 0 ), img ); p.end(); mPreviewList.item( i )->setIcon( enlarged ); } }
box enlarged(typename vector_type::value_type scalar) const { return enlarged( boost::numeric::ublas::scalar_vector<typename vector_type::value_type>( m_lower.size(), scalar)); }