Beispiel #1
0
bool TextLocation::getBoundingBox(const IplImage* src, int &clusterNum, CvRect &box) {

    vector<CvRect> rects(0);
    vector<CvPoint> centers(0);

    maxNumLimitedConnectComponet(src, kboxMaxNum, rects, centers);

    removeSmallRect(rects, centers);
    removePillarRect(rects, centers);

    if (centers.size() == 0) {

        return false;

    } else {

        // no clustering
        clusterNum = 1;
        getUnitedRects(rects, box);

        return true;
    }



}
/*
 Get the region at an index.  Use find(int) to get the index from an id.
*/
QRegion QWSRegionManager::region( int idx )
{
    QRegion r;
    if ( regIdx[idx].numRects )
	r.setRects( rects(regIdx[idx].data), regIdx[idx].numRects );
    return r;
}
/*
 Commit the region table to shared memory.
 The region table is not copied to shared memory every time it is
 modified as this would lead to a great deal of overhead when the server
 is calculating new regions.  Once all regions have been modified, commit()
 should be called to set the new region table in shared memory.
*/
void QWSRegionManager::commit()
{
    if ( client ) return;

    QWSDisplay::grab( TRUE );

    // copy region rects first
    int numRects;
    int offset = 0;
    QRect *r = rects(0);
    for ( int idx = 0; idx < regHdr->maxRegions; idx++ ) {
	if ( regIdx[idx].id != -1 ) {
	    numRects = regIdx[idx].numRects;
	    if ( numRects ) {
		if ( offset + numRects > regHdr->maxRects ) {
		    // What do we do?  Resize the shared memory?
		    qFatal( "Too many client rects" );
		}
		regIdx[idx].data = offset;
		memcpy( r, regions[idx]->rects().data(),
			numRects * sizeof(QRect) );
		r += numRects;
		offset += numRects;
	    }
	}
    }

    // now copy region header and index
    memcpy( data, regHdr, sizeof(QWSRegionHeader) );
    memcpy( data + sizeof(QWSRegionHeader),
	    (unsigned char *)regIdx,
	    regHdr->maxRegions * sizeof(QWSRegionIndex) );

    QWSDisplay::ungrab();
}
Beispiel #4
0
 void onDelayedSetup() override {
     SkRandom rand;
     SkAutoTMalloc<SkRect> rects(NUM_QUERY_RECTS);
     for (int i = 0; i < NUM_QUERY_RECTS; ++i) {
         rects[i] = fProc(rand, i, NUM_QUERY_RECTS);
     }
     fTree.insert(rects.get(), NUM_QUERY_RECTS);
 }
/*!\func
 * draw edge
 * \params no
 * \return no
 */
void EdgeAssotiation::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
	if (!sourceNode() || !destNode())
		return;
	QColor color (Qt::black);
	switch (getState()) {
	case OFF:
		color = Qt::gray;
		break;
	case OK:
		color = Qt::green;
		break;
	case WARNING:
	default:
		color = Qt::red;
	}
	painter->setPen(QPen(color, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
	float width = destNode()->boundingRect().width();
	float height = destNode()->boundingRect().height();
	QRectF rect(destNode()->pos().x() , destNode()->pos().y(), width, height);
	width = sourceNode()->boundingRect().width();
	height = sourceNode()->boundingRect().height();
	QRectF rects(sourceNode()->pos().x(), sourceNode()->pos().y(), width, height);
	painter->setBrush(color);
	painter->drawLine(destPoint, middlePoint);
	painter->drawLine(middlePoint, sourcePoint);
	painter->setPen(Qt::SolidLine);
	if(rect.contains(middlePoint))
	{//arrow enter in node by left or right
		int sign = destPoint.x() > sourcePoint.x() ? 1 : -1;
		//QMessageBox::information(0,"","arrow enter in node by left or right");
		QPointF destArrowP1 = QPointF(middlePoint.x() - sign*rect.width()/2, middlePoint.y());
		QPointF destArrowP2 = QPointF(middlePoint.x() - sign*(rect.width()/2 + arrowSize), middlePoint.y()-arrowSize/2);
		QPointF destArrowP3 = QPointF(middlePoint.x() - sign*(rect.width()/2 + arrowSize), middlePoint.y()+arrowSize/2);
		painter->setBrush(color);
		painter->drawPolygon(QPolygonF() << destArrowP3 << destArrowP1 << destArrowP2);
	}
	else
	{//arrow enter in node by top or bottom
		int sign = destPoint.y() > sourcePoint.y() ? 1 : -1;
		//QMessageBox::information(0,"","arrow enter in node by left or right");
		QPointF destArrowP1 = QPointF(destPoint.x(), destPoint.y()-sign*rect.height()/2);
		QPointF destArrowP2 = QPointF(destPoint.x()-arrowSize/2, destPoint.y() - sign*(rect.height()/2 + arrowSize));
		QPointF destArrowP3 = QPointF(destPoint.x()+arrowSize/2, destPoint.y() - sign*(rect.height()/2 + arrowSize));
		painter->setBrush(color);
		painter->drawPolygon(QPolygonF() << destArrowP3 << destArrowP1 << destArrowP2);
	}
	if(rects.contains(middlePoint))
		name->setPos((sourcePoint + destPoint)/2);
	else
	{
		if(sourcePoint.x() < destPoint.x())
			name->setPos(sourcePoint + QPointF(sourceNode()->boundingRect().width()/2,-name->boundingRect().height()));
		else
			name->setPos(sourcePoint + QPointF(-name->boundingRect().width()-sourceNode()->boundingRect().width()/2,-name->boundingRect().height()));
	}
}
Beispiel #6
0
// Constructeur par défault
Selectable::Selectable() : Entity(),
	m_isSelected(false),
	m_selectTag(m_animationManager->addAnimation(true, true, 0.1f))
{
	std::vector<sf::Rect<int> > rects(1, sf::Rect<int>(0,0, 36,36));

	m_animationManager->addAnim(m_selectTag, "media/image/select_tag.png", rects, "hold");
	m_selectTag->setAnim("hold", true);
	m_selectTag->setOrigin(18,18);
}
Beispiel #7
0
Vector<FloatRect> NinePieceImage::computeNonIntrinsicRects(const Vector<FloatRect>& intrinsicRects, const LayoutBoxExtent& slices)
{
    Vector<FloatRect> rects(MaxPiece);

    for (ImagePiece piece = MinPiece; piece < MaxPiece; ++piece) {
        if (isEmptyPieceRect(piece, slices))
            continue;
        rects[piece] = FloatRect(FloatPoint(), intrinsicRects[piece].size());
    }

    return rects;
}
Beispiel #8
0
    void onDraw(int loops, SkCanvas* canvas) override {
        SkRandom rand;
        SkAutoTMalloc<SkRect> rects(NUM_BUILD_RECTS);
        for (int i = 0; i < NUM_BUILD_RECTS; ++i) {
            rects[i] = fProc(rand, i, NUM_BUILD_RECTS);
        }

        for (int i = 0; i < loops; ++i) {
            SkRTree tree;
            tree.insert(rects.get(), NUM_BUILD_RECTS);
            SkASSERT(rects != nullptr);  // It'd break this bench if the tree took ownership of rects.
        }
    }
  void maskRenderWidget::paintEvent(QPaintEvent *e)
  {
		QImage * device = &pimpl_->foreground_;

    if (Impl::Rubber == pimpl_->shape_)
      device = &pimpl_->band_buffer_;

    pimpl_->paintOnDevice(device);

    QPainter painter(this);
    QVector<QRect> rects(e->region().rects());
    for (int i = 0; i < rects.count(); ++i)
    {
      QRect r = rects[i];
			painter.drawImage(r, *device, r);
    }
  }
Beispiel #10
0
void AbstractBox::paintEvent(QPaintEvent *e) {
	Painter p(this);
	auto clip = e->rect();
	auto paintTopRounded = clip.intersects(QRect(0, 0, width(), st::boxRadius));
	auto paintBottomRounded = clip.intersects(QRect(0, height() - st::boxRadius, width(), st::boxRadius));
	if (paintTopRounded || paintBottomRounded) {
		auto parts = RectPart::None | 0;
		if (paintTopRounded) parts |= RectPart::FullTop;
		if (paintBottomRounded) parts |= RectPart::FullBottom;
		App::roundRect(p, rect(), st::boxBg, BoxCorners, nullptr, parts);
	}
	auto other = e->region().intersected(QRect(0, st::boxRadius, width(), height() - 2 * st::boxRadius));
	if (!other.isEmpty()) {
		for (auto rect : other.rects()) {
			p.fillRect(rect, st::boxBg);
		}
	}
	if (!_additionalTitle.isEmpty() && clip.intersects(QRect(0, 0, width(), titleHeight()))) {
		paintAdditionalTitle(p);
	}
}
Beispiel #11
0
Vector<FloatRect> NinePieceImage::computeIntrinsicRects(const FloatRect& outer, const LayoutBoxExtent& slices, float deviceScaleFactor)
{
    FloatRect inner = outer;
    inner.move(slices.left(), slices.top());
    inner.contract(slices.left() + slices.right(), slices.top() + slices.bottom());
    ASSERT(outer.contains(inner));

    Vector<FloatRect> rects(MaxPiece);

    rects[TopLeftPiece]     = snapRectToDevicePixels(outer.x(),    outer.y(),    slices.left(),  slices.top(),    deviceScaleFactor);
    rects[BottomLeftPiece]  = snapRectToDevicePixels(outer.x(),    inner.maxY(), slices.left(),  slices.bottom(), deviceScaleFactor);
    rects[LeftPiece]        = snapRectToDevicePixels(outer.x(),    inner.y(),    slices.left(),  inner.height(),  deviceScaleFactor);

    rects[TopRightPiece]    = snapRectToDevicePixels(inner.maxX(), outer.y(),    slices.right(), slices.top(),    deviceScaleFactor);
    rects[BottomRightPiece] = snapRectToDevicePixels(inner.maxX(), inner.maxY(), slices.right(), slices.bottom(), deviceScaleFactor);
    rects[RightPiece]       = snapRectToDevicePixels(inner.maxX(), inner.y(),    slices.right(), inner.height(),  deviceScaleFactor);

    rects[TopPiece]         = snapRectToDevicePixels(inner.x(),    outer.y(),    inner.width(),  slices.top(),    deviceScaleFactor);
    rects[BottomPiece]      = snapRectToDevicePixels(inner.x(),    inner.maxY(), inner.width(),  slices.bottom(), deviceScaleFactor);

    rects[MiddlePiece]      = snapRectToDevicePixels(inner.x(),    inner.y(),    inner.width(),  inner.height(),  deviceScaleFactor);
    return rects;
}
Beispiel #12
0
DEF_TEST(RTree, reporter) {
    int expectedDepthMin = -1;
    int tmp = NUM_RECTS;
    while (tmp > 0) {
        tmp -= static_cast<int>(pow(static_cast<double>(SkRTree::kMaxChildren),
                                    static_cast<double>(expectedDepthMin + 1)));
        ++expectedDepthMin;
    }

    int expectedDepthMax = -1;
    tmp = NUM_RECTS;
    while (tmp > 0) {
        tmp -= static_cast<int>(pow(static_cast<double>(SkRTree::kMinChildren),
                                    static_cast<double>(expectedDepthMax + 1)));
        ++expectedDepthMax;
    }

    SkRandom rand;
    SkAutoTMalloc<SkRect> rects(NUM_RECTS);
    for (size_t i = 0; i < NUM_ITERATIONS; ++i) {
        SkRTree rtree;
        REPORTER_ASSERT(reporter, 0 == rtree.getCount());

        for (int j = 0; j < NUM_RECTS; j++) {
            rects[j] = random_rect(rand);
        }

        rtree.insert(rects.get(), NUM_RECTS);
        SkASSERT(rects);  // SkRTree doesn't take ownership of rects.

        run_queries(reporter, rand, rects, rtree);
        REPORTER_ASSERT(reporter, NUM_RECTS == rtree.getCount());
        REPORTER_ASSERT(reporter, expectedDepthMin <= rtree.getDepth() &&
                                  expectedDepthMax >= rtree.getDepth());
    }
}
Error EditorTextureImportPlugin::import2(const String& p_path, const Ref<ResourceImportMetadata>& p_from,EditorExportPlatform::ImageCompression p_compr, bool p_external){



	ERR_FAIL_COND_V(p_from->get_source_count()==0,ERR_INVALID_PARAMETER);

	Ref<ResourceImportMetadata> from=p_from;

	Ref<ImageTexture> texture;
	Vector<Ref<AtlasTexture> > atlases;
	bool atlas = from->get_option("atlas");

	int flags=from->get_option("flags");
	uint32_t tex_flags=0;

	if (flags&EditorTextureImportPlugin::IMAGE_FLAG_REPEAT)
		tex_flags|=Texture::FLAG_REPEAT;
	if (flags&EditorTextureImportPlugin::IMAGE_FLAG_FILTER)
		tex_flags|=Texture::FLAG_FILTER;
	if (!(flags&EditorTextureImportPlugin::IMAGE_FLAG_NO_MIPMAPS))
		tex_flags|=Texture::FLAG_MIPMAPS;

	int shrink=1;
	if (from->has_option("shrink"))
		shrink=from->get_option("shrink");

	if (atlas) {

		//prepare atlas!
		Vector< Image > sources;
		bool alpha=false;
		bool crop = from->get_option("crop");

		EditorProgress ep("make_atlas","Build Atlas For: "+p_path.get_file(),from->get_source_count()+3);

		print_line("sources: "+itos(from->get_source_count()));
		for(int i=0;i<from->get_source_count();i++) {

			String path = EditorImportPlugin::expand_source_path(from->get_source_path(i));
			ep.step("Loading Image: "+path,i);
			print_line("source path: "+path);
			Image src;
			Error err = ImageLoader::load_image(path,&src);
			if (err) {
				EditorNode::add_io_error("Couldn't load image: "+path);
				return err;
			}

			if (src.detect_alpha())
				alpha=true;

			sources.push_back(src);
		}
		ep.step("Converting Images",sources.size());

		for(int i=0;i<sources.size();i++) {

			if (alpha) {
				sources[i].convert(Image::FORMAT_RGBA);
			} else {
				sources[i].convert(Image::FORMAT_RGB);
			}
		}

		//texturepacker is not really good for optimizing, so..
		//will at some point likely replace with my own
		//first, will find the nearest to a square packing
		int border=1;

		Vector<Size2i> src_sizes;
		Vector<Rect2> crops;

		ep.step("Cropping Images",sources.size()+1);

		for(int j=0;j<sources.size();j++) {

			Size2i s;
			if (crop) {
				Rect2 crop = sources[j].get_used_rect();
				print_line("CROP: "+crop);
				s=crop.size;
				crops.push_back(crop);
			} else {

				s=Size2i(sources[j].get_width(),sources[j].get_height());
			}
			s+=Size2i(border*2,border*2);
			src_sizes.push_back(s); //add a line to constraint width
		}

		Vector<Point2i> dst_positions;
		Size2i dst_size;
		EditorAtlas::fit(src_sizes,dst_positions,dst_size);

		print_line("size that workeD: "+itos(dst_size.width)+","+itos(dst_size.height));

		ep.step("Blitting Images",sources.size()+2);

		Image atlas;
		atlas.create(nearest_power_of_2(dst_size.width),nearest_power_of_2(dst_size.height),0,alpha?Image::FORMAT_RGBA:Image::FORMAT_RGB);

		for(int i=0;i<sources.size();i++) {

			int x=dst_positions[i].x;
			int y=dst_positions[i].y;

			Ref<AtlasTexture> at = memnew( AtlasTexture );
			Size2 sz = Size2(sources[i].get_width(),sources[i].get_height());
			if (crop && sz!=crops[i].size) {
				Rect2 rect = crops[i];
				rect.size=sz-rect.size;
				at->set_region(Rect2(x+border,y+border,crops[i].size.width,crops[i].size.height));
				at->set_margin(rect);
				atlas.blit_rect(sources[i],crops[i],Point2(x+border,y+border));
			} else {
				at->set_region(Rect2(x+border,y+border,sz.x,sz.y));
				atlas.blit_rect(sources[i],Rect2(0,0,sources[i].get_width(),sources[i].get_height()),Point2(x+border,y+border));
			}
			String apath = p_path.get_base_dir().plus_file(from->get_source_path(i).get_file().basename()+".atex");
			print_line("Atlas Tex: "+apath);
			at->set_path(apath);
			atlases.push_back(at);

		}
		if (ResourceCache::has(p_path)) {
			texture = Ref<ImageTexture> ( ResourceCache::get(p_path)->cast_to<ImageTexture>() );
		} else {
			texture = Ref<ImageTexture>( memnew( ImageTexture ) );
		}
		texture->create_from_image(atlas,tex_flags);

	} else {
		ERR_FAIL_COND_V(from->get_source_count()!=1,ERR_INVALID_PARAMETER);

		String src_path = EditorImportPlugin::expand_source_path(from->get_source_path(0));

		if (ResourceCache::has(p_path)) {
			Resource *r = ResourceCache::get(p_path);

			texture = Ref<ImageTexture> ( r->cast_to<ImageTexture>() );

			Image img;
			Error err = img.load(src_path);
			ERR_FAIL_COND_V(err!=OK,ERR_CANT_OPEN);
			texture->create_from_image(img);
		} else {
			texture=ResourceLoader::load(src_path,"ImageTexture");
		}

		ERR_FAIL_COND_V(texture.is_null(),ERR_CANT_OPEN);
		if (!p_external)
			from->set_source_md5(0,FileAccess::get_md5(src_path));

	}


	int format=from->get_option("format");
	float quality=from->get_option("quality");

	if (!p_external) {
		from->set_editor(get_name());
		texture->set_path(p_path);
		texture->set_import_metadata(from);
	}

	if (atlas) {

		if (p_external) {
			//used by exporter
			Array rects(true);
			for(int i=0;i<atlases.size();i++) {
				rects.push_back(atlases[i]->get_region());
				rects.push_back(atlases[i]->get_margin());
			}
			from->set_option("rects",rects);

		} else {
			//used by importer
			for(int i=0;i<atlases.size();i++) {
				String apath = atlases[i]->get_path();
				atlases[i]->set_atlas(texture);
				Error err = ResourceSaver::save(apath,atlases[i]);
				if (err) {
					EditorNode::add_io_error("Couldn't save atlas image: "+apath);
					return err;
				}
				from->set_source_md5(i,FileAccess::get_md5(apath));
			}
		}
	}


	if (format==IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS || format==IMAGE_FORMAT_COMPRESS_DISK_LOSSY) {

		Image image=texture->get_data();
		ERR_FAIL_COND_V(image.empty(),ERR_INVALID_DATA);

		bool has_alpha=image.detect_alpha();
		if (!has_alpha && image.get_format()==Image::FORMAT_RGBA) {

			image.convert(Image::FORMAT_RGB);

		}

		if (image.get_format()==Image::FORMAT_RGBA && flags&IMAGE_FLAG_FIX_BORDER_ALPHA) {

			image.fix_alpha_edges();
		}


		if (shrink>1) {

			int orig_w=image.get_width();
			int orig_h=image.get_height();
			image.resize(orig_w/shrink,orig_h/shrink);
			texture->create_from_image(image,tex_flags);
			texture->set_size_override(Size2(orig_w,orig_h));


		} else {

			texture->create_from_image(image,tex_flags);
		}


		if (format==IMAGE_FORMAT_COMPRESS_DISK_LOSSLESS) {
			texture->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSLESS);
		} else {
			texture->set_storage(ImageTexture::STORAGE_COMPRESS_LOSSY);
		}



		texture->set_lossy_storage_quality(quality);

		Error err = ResourceSaver::save(p_path,texture);

		if (err!=OK) {
			EditorNode::add_io_error("Couldn't save converted texture: "+p_path);
			return err;
		}


	} else {

		print_line("compress...");
		Image image=texture->get_data();
		ERR_FAIL_COND_V(image.empty(),ERR_INVALID_DATA);


		bool has_alpha=image.detect_alpha();
		if (!has_alpha && image.get_format()==Image::FORMAT_RGBA) {

			image.convert(Image::FORMAT_RGB);

		}

		if (image.get_format()==Image::FORMAT_RGBA && flags&IMAGE_FLAG_FIX_BORDER_ALPHA) {

			image.fix_alpha_edges();
		}

		int orig_w=image.get_width();
		int orig_h=image.get_height();

		if (shrink>1) {
			image.resize(orig_w/shrink,orig_h/shrink);
			texture->create_from_image(image,tex_flags);
			texture->set_size_override(Size2(orig_w,orig_h));
		}

		if (!(flags&IMAGE_FLAG_NO_MIPMAPS)) {
			image.generate_mipmaps();

		}

		if (format!=IMAGE_FORMAT_UNCOMPRESSED) {

			compress_image(p_compr,image,flags&IMAGE_FLAG_COMPRESS_EXTRA);
		}


		print_line("COMPRESSED TO: "+itos(image.get_format()));
		texture->create_from_image(image,tex_flags);


		if (shrink>1) {
			texture->set_size_override(Size2(orig_w,orig_h));
		}

		uint32_t save_flags=ResourceSaver::FLAG_COMPRESS;

		Error err = ResourceSaver::save(p_path,texture,save_flags);
		if (err!=OK) {
			EditorNode::add_io_error("Couldn't save converted texture: "+p_path);
			return err;
		}

	}

	return OK;
}
template <class T> void ossimWatermarkFilter::fill(T /* dummy */)
{
   const ossimIrect TILE_RECT = theTile->getImageRectangle();

   // We will only fill data within the input bounding rect.
   const ossimIrect CLIPPED_TILE_RECT =
      TILE_RECT.clipToRect(theInputBoundingRect);

   // Get the bounding rectangles.
   vector<ossimIrect> rects(0);
   getIntersectingRects(rects);

   if (rects.size() == 0)
   {
      return;
   }

   //---
   // Have watermark rectangles that intersect this tile so we need to process.
   //---
   ossim_uint32 band = 0;
   ossim_float64 inputPixWeight = 1.0 - theWatermarkWeight;

   // Get a pointers to the watermark buffers (wmBuf) and nulls wn.
   T** wmBuf = new T*[theWatermarkNumberOfBands];
   for (band = 0; band < theWatermarkNumberOfBands; ++band)
   {
      wmBuf[band] = static_cast<T*>(theWatermark->getBuf(band));
   }
   
   // Get a pointers to the output tile buffers and nulls in.
   T** otBuf = new T*[theInputNumberOfBands];
   for (band = 0; band < theInputNumberOfBands; ++band)
   {
      otBuf[band] = static_cast<T*>(theTile->getBuf(band));
   }

   // Get the width of the buffers for indexing.
   ossim_int32 wmWidth = static_cast<ossim_int32>(theWatermark->getWidth());
   ossim_int32 otWidth = static_cast<ossim_int32>(theTile->getWidth());

   const ossim_float64* wmNull = theWatermark->getNullPix();
   const ossim_float64* otMin  = theTile->getMinPix();
   const ossim_float64* otMax  = theTile->getMaxPix();
   const ossim_float64* otNull = theTile->getNullPix();
   
      
   // Control loop through intersecting rectangles.
   vector<ossimIrect>::const_iterator i = rects.begin();
   while (i != rects.end())
   {
      if ( (*i).intersects(CLIPPED_TILE_RECT) )
      {
         //---
         // This is the rectangle we want to fill relative to requesting
         // image space.
         //---
         const ossimIrect CLIPPED_WATERMARRK_RECT =
            (*i).clipToRect(CLIPPED_TILE_RECT);

         ossim_int32 clipHeight = CLIPPED_WATERMARRK_RECT.height();
         ossim_int32 clipWidth  = CLIPPED_WATERMARRK_RECT.width();

         // Compute the starting offset into the wmBuf and otBuf.
         ossim_int32 wmOffset =
            (CLIPPED_WATERMARRK_RECT.ul().y - (*i).ul().y) * wmWidth +
            CLIPPED_WATERMARRK_RECT.ul().x  - (*i).ul().x;
         ossim_int32 otOffset =
            (CLIPPED_WATERMARRK_RECT.ul().y - TILE_RECT.ul().y)* otWidth +
             CLIPPED_WATERMARRK_RECT.ul().x - TILE_RECT.ul().x;
         
         // Line loop...
         for (ossim_int32 line = 0; line < clipHeight; ++line)
         {
            // Sample loop...
            for (ossim_int32 sample = 0; sample < clipWidth; ++sample)
            {
               // Output band control loop until all output bands are filled.
               ossim_uint32 otBand = 0;
               while (otBand < theInputNumberOfBands)
               {
                  // Band loop through the watermark.
                  for (ossim_uint32 wmBand = 0;
                       wmBand < theWatermarkNumberOfBands;
                       ++wmBand)
                  {
                     if (wmBuf[wmBand][wmOffset+sample] != wmNull[wmBand])
                     {
                        // Apply the weight to the input pixel.
                        ossim_float64 p1 =
                           (otBuf[otBand][otOffset+sample] != otNull[otBand]) ?
                           otBuf[otBand][otOffset+sample] * inputPixWeight :
                           0.0;

                        // Apply the Weight to the watermark pixel.
                        ossim_float64 p2 =
                           wmBuf[wmBand][wmOffset+sample]*theWatermarkWeight;

                        // Add them up.
                        ossim_float64 p3 = p1 + p2;

                        // Cast to output type with range checking.
                        otBuf[otBand][otOffset+sample] = static_cast<T>(
                           ( (p3 >= otMin[otBand]) ?
                             (p3 < otMax[otBand] ? p3 : otMax[otBand]) :
                             otNull[otBand]) );
                     }
                     ++otBand;
                     
                     // We stop when we reach here.  All output bands filled.
                     if (otBand == theInputNumberOfBands)
                     {
                        break;
                     }
                     
                  } // End of band through watermark.
                  
               } // End of outer band loop.
               
            } // End of sample loop.

            wmOffset += wmWidth;
            otOffset += otWidth;
            
         } // End of line loop.

      } // End "if ( (*i).intersects(TILE_RECT) )"
      
      ++i; // Go to next rectangle to fill if any.
      
   } // End of "while (i != rects.end())"

   // Clean up.
   delete [] wmBuf;
   delete [] otBuf;
   
   theTile->validate();
}
Beispiel #15
0
void ColorPalette::drawTimePannel(QPainter &painter)
{
    painter.save();
    QPen pen;
    pen.setColor(QColor(0,0,0));
    pen.setWidthF(1);
    painter.setPen(pen);
    painter.setFont(QFont(QObject::tr("WenQuanYi"),8));
    float x = draw_erae_.left();
    float y = draw_erae_.top();

//    float width = painter.fontMetrics().width("Time");
//    painter.drawText(QRectF(x - 5,y - 15,width,15),Qt::AlignCenter|Qt::AlignTop,"Time");

    float diff = (draw_erae_.width())/1020;

    QRgb srgb = QRgb(0x660000);
    int sred = qRed(srgb);

    int k = 1020;
    QRectF rect;
    while(k >0)
    {
        rect = QRectF(draw_erae_.left() + k * diff, draw_erae_.top(),diff,draw_erae_.height() * 0.25);
        //painter.drawRect(rect);
        if (k < 153)
        {
             painter.fillRect(rect, QBrush(QColor(sred + k, 0, 0)));
        }
        else if (k < 408 && k >= 153)
        {
            painter.fillRect(rect, QBrush(QColor(255, k - 153, 0)));
        }
        else if ( k < 663 && k >= 408)
        {
            painter.fillRect(rect, QBrush(QColor(255 - (k - 408), 255, 0)));
        }
        else if (k < 918 && k>= 663)
        {
            painter.fillRect(rect, QBrush(QColor(0, 255 - (k - 663), k - 663)));
        }
        else
        {
            painter.fillRect(rect, QBrush(QColor(0,0,255- (k - 918))));
        }
        k--;
    }

    QRectF rects(draw_erae_.left(),draw_erae_.top(),draw_erae_.width(),draw_erae_.height()*0.25);
    painter.drawRect(rects);

    int partion = 1;
    int datastep = 0;
    if (days_ <= 7) //如果总天数小于等于7天则分成4份,否则分成6份
    {
        partion = 4;
        datastep = 2;
    }
    else
    {
        partion = 6;
        datastep = days_ / partion;
    }

    float step = draw_erae_.width() / partion;

    QString tempday = "";
    float line = 0;

    while(line < draw_erae_.width())
    {
        if (partion == 4)
        {
            painter.drawLine(x + line,y,x + line,y + draw_erae_.height()*0.25);
            tempday = start_date_.toString("MM/dd");
            float width = painter.fontMetrics().width(tempday);
            float height = painter.fontMetrics().height();
            painter.drawText(QRectF(x+line-width/2,y+draw_erae_.height()*0.25+4,width,height),Qt::AlignCenter,tempday);
            start_date_ = start_date_.addDays(datastep);
            line += step;
        }
        else
        {
            line += step;
            if (line < draw_erae_.width())
            {
                painter.drawLine(x + line,y,x + line,y + draw_erae_.height()*0.25);
                tempday = start_date_.toString("MM/dd");
                float width = painter.fontMetrics().width(tempday);
                float height = painter.fontMetrics().height();
                painter.drawText(QRectF(x+line-width/2,y+draw_erae_.height()*0.25+4,width,height),Qt::AlignCenter,tempday);
                start_date_ = start_date_.addDays(datastep);
            }
        }

    }
    painter.restore();
}
Beispiel #16
0
std::multimap<MyVector2, MyVector2> AlgoMaxRects::pack(const std::vector< MyVector2> &temp, const MyVector2 &size, bool &fine)
{
   std::list<MyBox> freeBoxes;
   freeBoxes.push_back(MyBox(0,0,size.x,size.y));

   std::list<MyVector2> rects(temp.begin(), temp.end());

   std::multimap<MyVector2, MyVector2> boxes;

   while (!rects.empty())
   {
      int min = std::max(size.x,size.y);

      std::list<MyVector2>::iterator minIterRects = rects.end();
      std::list<MyBox>::iterator minIterFreeBoxes = freeBoxes.end();

      for (auto iterRects = rects.begin(); iterRects != rects.end(); iterRects++)
      {
         for (auto iterFreeBoxes = freeBoxes.begin(); iterFreeBoxes != freeBoxes.end(); iterFreeBoxes++)
         {

            int distance = std::min(iterFreeBoxes->size.y - iterRects->y, iterFreeBoxes->size.x - iterRects->x);

            if (distance < 0)
            {
               //std::cout<<"The box "<<iterFreeBoxes->pos<<" with a size "<<iterFreeBoxes->size<<" is too small for "<<*iterRects<<std::endl;
               continue;
            }

            if (distance < min)
            {
               //std::cout<<"The box "<<iterFreeBoxes->pos<<" with a size "<<iterFreeBoxes->size<<" is ok for "<<*iterRects<<std::endl;
               min = distance;
               minIterRects = iterRects;
               minIterFreeBoxes = iterFreeBoxes;
            }

         }
      }

      if (minIterRects == rects.end() || minIterFreeBoxes == freeBoxes.end())
      {
         return std::multimap<MyVector2, MyVector2>();
      }
      

      //std::cout<<"I am placing the box "<<*minIterRects<<" into the position "<<minIterFreeBoxes->pos<<std::endl;
      //std::cout<<minIterFreeBoxes->pos<<std::endl;

      MyBox insertedBox = MyBox(minIterFreeBoxes->pos,*minIterRects);
      boxes.insert(std::make_pair(*minIterRects,minIterFreeBoxes->pos));

      freeBoxes.push_front(MyBox(
                             MyVector2(
                                minIterFreeBoxes->pos.x + minIterRects->x,
                                minIterFreeBoxes->pos.y + 0),

                             MyVector2(
                                minIterFreeBoxes->size.x - minIterRects->x,
                                minIterFreeBoxes->size.y)
                          ));


      freeBoxes.push_front(MyBox(
                             MyVector2(
                                minIterFreeBoxes->pos.x + 0,
                                minIterFreeBoxes->pos.y + minIterRects->y),

                             MyVector2(
                                minIterFreeBoxes->size.x,
                                minIterFreeBoxes->size.y - minIterRects->y)
                          ));


      freeBoxes.erase(minIterFreeBoxes);


      MyVector2 a1 = insertedBox.pos;
      //MyVector2 a2 = MyVector2(insertedBox.pos.x + insertedBox.size.x,insertedBox.pos.y);
      MyVector2 a3 = MyVector2(insertedBox.pos.x + insertedBox.size.x,insertedBox.pos.y + insertedBox.size.y);
      //MyVector2 a4 = MyVector2(insertedBox.pos.x                     ,insertedBox.pos.y + insertedBox.size.y);

      for (auto iterFreeBoxes = freeBoxes.begin(); iterFreeBoxes != freeBoxes.end();)
      {
         assert(iterFreeBoxes != freeBoxes.end());
         //assert(!(iterFreeBoxes->pos == insertedBox.pos));
         MyVector2 b1 = iterFreeBoxes->pos;
         //MyVector2 b2 = MyVector2(iterFreeBoxes->pos.x + iterFreeBoxes->size.x,iterFreeBoxes->pos.y);
         MyVector2 b3 = MyVector2(iterFreeBoxes->pos.x + iterFreeBoxes->size.x,iterFreeBoxes->pos.y + iterFreeBoxes->size.y);
         //MyVector2 b4 = MyVector2(iterFreeBoxes->pos.x                        ,iterFreeBoxes->pos.y + iterFreeBoxes->size.y);

         if ((a1.x >= b3.x) || (a1.y >= b3.y) ||
               (a3.x <= b1.x) || (a3.y <= b1.y))
         {
            iterFreeBoxes++;
            continue;   // not intersecting
         }


         if ((a1.x > b1.x) /*  && (a1.x < b3.x) */) // If there is a chance that line a1,a2 is in the shape b
         {
            freeBoxes.push_front(MyBox(
                                    MyVector2(
                                       iterFreeBoxes->pos.x,
                                       iterFreeBoxes->pos.y),

                                    MyVector2(
                                       a1.x - b1.x,
                                       iterFreeBoxes->size.y)
                                 ));
         }

         if ((a3.x < b3.x) /*  && (a1.x < b3.x) */) // If there is a chance that line a1,a2 is in the shape b
         {
            freeBoxes.push_front(MyBox(
                                    MyVector2(
                                       a3.x,
                                       iterFreeBoxes->pos.y),

                                    MyVector2(
                                       b3.x - a3.x,
                                       iterFreeBoxes->size.y)
                                 ));
         }

         if ((a1.y > b1.y) /*  && (a1.x < b3.x) */) // If there is a chance that line a1,a2 is in the shape b
         {
            freeBoxes.push_front(MyBox(
                                    MyVector2(
                                       iterFreeBoxes->pos.x,
                                       iterFreeBoxes->pos.y),

                                    MyVector2(
                                       iterFreeBoxes->size.x,
                                       a1.y - b1.y)
                                 ));
         }

         if ((a3.y < b3.y) /*  && (a1.x < b3.x) */) // If there is a chance that line a1,a2 is in the shape b
         {
            freeBoxes.push_front(MyBox(
                                    MyVector2(
                                       iterFreeBoxes->pos.x,
                                       a3.y),

                                    MyVector2(
                                       iterFreeBoxes->size.x,
                                       b3.y - a3.y)
                                 ));
         }

         auto blah = iterFreeBoxes++;
         freeBoxes.erase(blah);

      }

      for (auto iterFreeBoxes = freeBoxes.begin(); iterFreeBoxes != freeBoxes.end(); iterFreeBoxes++)
      {
         assert(iterFreeBoxes != freeBoxes.end());
         auto iterFreeBoxes2 = iterFreeBoxes;
         iterFreeBoxes2++;

         while ( iterFreeBoxes2 != freeBoxes.end())
         {
            assert(iterFreeBoxes != freeBoxes.end());

            assert(iterFreeBoxes2 != freeBoxes.end());
            assert(iterFreeBoxes != iterFreeBoxes2);
            //assert(!((*iterFreeBoxes).pos == (*iterFreeBoxes2).pos));

            MyVector2 b1 = iterFreeBoxes->pos;
            //MyVector2 b2 = MyVector2(iterFreeBoxes->pos.x + iterFreeBoxes->size.x,iterFreeBoxes->pos.y);
            MyVector2 b3 = MyVector2(iterFreeBoxes->pos.x + iterFreeBoxes->size.x,iterFreeBoxes->pos.y + iterFreeBoxes->size.y);
            //MyVector2 b4 = MyVector2(iterFreeBoxes->pos.x                        ,iterFreeBoxes->pos.y + iterFreeBoxes->size.y);

            MyVector2 c1 = iterFreeBoxes2->pos;
            //MyVector2 c2 = MyVector2(iterFreeBoxes2->pos.x + iterFreeBoxes2->size.x,iterFreeBoxes2->pos.y);
            MyVector2 c3 = MyVector2(iterFreeBoxes2->pos.x + iterFreeBoxes2->size.x,iterFreeBoxes2->pos.y + iterFreeBoxes2->size.y);
            //MyVector2 c4 = MyVector2(iterFreeBoxes2->pos.x                         ,iterFreeBoxes2->pos.y + iterFreeBoxes2->size.y);

            if (c1.x >= b1.x && c1.y >= b1.y &&
                  c3.x <= b3.x && c3.y <= b3.y)
            {
               //std::cout<<"Erasing a box "<<iterFreeBoxes->pos<<", "<<iterFreeBoxes->size<<" and "<<iterFreeBoxes2->pos<<", "<<iterFreeBoxes2->size<<std::endl;
               auto blah = iterFreeBoxes2++;
               freeBoxes.erase(blah);
            }

            else 
               iterFreeBoxes2++;

         }
      }


      /*
      BOOSFOREACH(MyBox &lol, freeBoxes)
      {
         //std::cout<<"A free box with "<<lol.pos<<std::endl;
      }
      */

      rects.erase(minIterRects);
      //std::cout<<"Finished with said loop"<<std::endl;


   }

   fine = 1;
   return boxes;
}
int main(int argc, char *argv[])
{
    std::string train_path;
    std::string gt_path;
    std::string output_file;
    std::string output_patch_file;
    int numbers = 0;
    int start = 100;
    int c;
    std::vector<int> excludes(nexcludes);
    excludes.assign(exclude_nums, exclude_nums + nexcludes);

    while ((c = getopt(argc, argv, "i:g:n:s:e:o:p:h")) != -1) {
        switch (c) {
            case 'i':
                train_path = optarg;
                break;
            case 'g':
                gt_path = optarg;
                break;
            case 'n':
                {
                std::stringstream stream(optarg);
                stream >> numbers;
                }
                break;
            case 's':
                {
                std::stringstream stream(optarg);
                stream >> start;
                }
                break;
            case 'e':
                excludes = spliti(std::string(optarg),',');
                break;
            case 'o':
                output_file = optarg;
                break;
            case 'p':
                output_patch_file = optarg;
                break;
            case 'h':
            default:
                std::cout << c << std::endl;
                std::cerr << "Usage: extract_train_set OPTIONS" << std::endl 
                    << "\t -i <training directory>" << std::endl 
                    << "\t -g <gt box directory>" << std::endl 
                    << "\t -n <maximum id>" << std::endl 
                    << "\t -s <start id>" << std::endl
                    << "\t -o <output path>" << std::endl
                    << "\t -p <output patch file>" << std::endl
                    << "\t -e <exclude list>" << std::endl;
                return 1;
        }
    }

    if (train_path == "" || gt_path == "") {
        std::cerr << "Training path and gt path are mandatory" << std::endl;
        return 1;
    }
    if (output_file == "") {
        std::cerr << "output file is mandatory" << std::endl;
        return 1;
    }

    srand(time(NULL));

    std::ofstream ofs(output_file.c_str());

    std::ofstream ofs_patch;
    if (output_patch_file != "") {
        ofs_patch.open(output_patch_file);
    }

    for (unsigned int i = start; i <= numbers; ++i) {

        if (std::find(excludes.begin(), excludes.end(), i) != excludes.end()) continue;
        std::cout << "Processing: " << i << std::endl;

        std::string train_img;
        std::string gt_box;
        {
            std::stringstream stream(train_path);
            stream << train_path << "/" << i << ".jpg";
            train_img = (stream.str());
        }
        {
            std::stringstream stream(gt_path);
            stream << gt_path << "/" << i << ".txt";
            gt_box = (stream.str());
        }

        std::vector<cv::Rect> rects(read_boxes(gt_box));

        cv::Mat img = cv::imread(train_img);

        // first we extract the positive instances
        for (unsigned int j = 0; j < rects.size(); ++j) {
            extract_positive_samples(img, rects[j], ofs, ofs_patch);
        }

        std::cout << "Extracting random images" << std::endl;
        // then we gonna extract negative samples
        float size = img.rows;
        cv::Mat scaledImage = img;
        float scale = 1.0;
        for (unsigned int j = 0; j < nscales; ++j) {
            std::cout << "scale: " << size << std::endl;

            if (scaledImage.rows > (int) size) {
                float ratio = size / scaledImage.rows;
                int h = (int) size;
                int w = ratio * scaledImage.cols;
                std::cout << w << " " << h << " " << ratio << std::endl;
                cv::resize(img, scaledImage, cv::Size(w,h));
                rects = scale_rects(rects, ratio);
                scale = scale * ratio;
            }

            if (scaledImage.rows < window_height || scaledImage.cols < window_width) {
                continue;
            }

            extract_negative_samples(scaledImage, rects, scale, ofs, ofs_patch);

            size = size * scale_ratio;
        }
    }

    return 0;
}