void TrackerPool::display(yarp::sig::ImageOf<yarp::sig::PixelRgb> &img){ for(int ii=0; ii<trackers_.size(); ii++){ if(trackers_[ii].is_active()){ //yarp::sig::PixelRgb color = trackers_[ii].is_active()?yarp::sig::PixelRgb(0, 0, 255):yarp::sig::PixelRgb(0, 255, 0); yarp::sig::PixelRgb color = yarp::sig::PixelRgb(0, 0, 255); trackers_[ii].display(img, color); } } std::vector<int> to_delete; for(int ii=0; ii<collisions_disp_.size(); ii++){ for(int jj=-1; jj<1; jj++){ for(int kk=-1; kk<1; kk++){ int x = collisions_disp_[ii].x + jj; int y = collisions_disp_[ii].y + kk; if(x>=0 && x<128 && y>=0 && y<128){ img.pixel(y, x) = yarp::sig::PixelRgb(20, 0, 255); } } } if(++collisions_disp_[ii].count_disp == 100){ to_delete.push_back(ii); } } while(to_delete.size()>0){ int to_del = to_delete.back(); collisions_disp_.erase(collisions_disp_.begin() + to_del); to_delete.pop_back(); } }
bool BayerCarrier::debayerHalf(yarp::sig::ImageOf<PixelMono>& src, yarp::sig::ImageOf<PixelRgb>& dest) { // dc1394 doesn't seem safe for arbitrary data widths if (src.width()%8==0) { dc1394video_frame_t dc_src; dc1394video_frame_t dc_dest; setDcImage(src,&dc_src,dcformat); setDcImage(dest,&dc_dest,dcformat); dc1394_debayer_frames(&dc_src,&dc_dest,DC1394_BAYER_METHOD_DOWNSAMPLE); return true; } if (bayer_method_set && !warned) { fprintf(stderr, "Not using dc1394 debayer methods (image width not a multiple of 8)\n"); warned = true; } // a safer implementation that doesn't use dc1394 int w = src.width(); int h = src.height(); int wo = dest.width(); int ho = dest.height(); int goff1 = 1-goff; int roffx = roff?goff:goff1; int boff = 1-roff; int boffx = boff?goff:goff1; for (int yo=0; yo<ho; yo++) { for (int xo=0; xo<wo; xo++) { PixelRgb& po = dest.pixel(xo,yo); int x = xo*2; int y = yo*2; if (x+1>=w-1 || y+1>=h-1) { po = PixelRgb(0,0,0); continue; } po.r = src.pixel(x+roffx,y+roff); po.b = src.pixel(x+boffx,y+boff); po.g = (PixelMono)(0.5*(src.pixel(x+goff,y)+src.pixel(x+goff1,y+1))); } } return true; }
void copyImage(yarp::sig::ImageOf<yarp::sig::PixelRgb>& src, Magick::Image& dest) { int h = src.height(); int w = src.width(); dest.size(Magick::Geometry(w,h)); dest.depth(8); for (int i=0; i<h; i++) { // must transfer row by row, since YARP may use padding in representation Magick::PixelPacket *packet = dest.setPixels(0,i,w,1); dest.readPixels(Magick::RGBQuantum,(unsigned char *)(&src.pixel(0,i))); } dest.syncPixels(); }
void copyImage(Magick::Image& src, yarp::sig::ImageOf<yarp::sig::PixelRgb>& dest) { Magick::Geometry g = src.size(); int h = g.height(); int w = g.width(); src.depth(8); dest.resize(w,h); for (int i=0; i<h; i++) { // must transfer row by row, since YARP may use padding in representation Magick::PixelPacket *packet = src.getPixels(0,i,w,1); src.writePixels(Magick::RGBQuantum,(unsigned char *)(&dest.pixel(0,i))); } src.syncPixels(); }
bool BayerCarrier::debayerFull(yarp::sig::ImageOf<PixelMono>& src, yarp::sig::ImageOf<PixelRgb>& dest) { // dc1394 doesn't seem safe for arbitrary data widths if (src.width()%8==0) { dc1394video_frame_t dc_src; dc1394video_frame_t dc_dest; setDcImage(src,&dc_src,dcformat); setDcImage(dest,&dc_dest,dcformat); dc1394_debayer_frames(&dc_src,&dc_dest, (dc1394bayer_method_t)bayer_method); return true; } if (bayer_method_set && !warned) { fprintf(stderr, "Not using dc1394 debayer methods (image width not a multiple of 8)\n"); warned = true; } int w = dest.width(); int h = dest.height(); int goff1 = 1-goff; int roffx = roff?goff:goff1; int boff = 1-roff; int boffx = boff?goff:goff1; for (int y=0; y<h; y++) { for (int x=0; x<w; x++) { PixelRgb& po = dest.pixel(x,y); // G if ((x+y)%2==goff) { po.g = src.pixel(x,y); } else { float g = 0; int ct = 0; if (x>0) { g += src.pixel(x-1,y); ct++; } if (x<w-1) { g += src.pixel(x+1,y); ct++; } if (y>0) { g += src.pixel(x,y-1); ct++; } if (y<h-1) { g += src.pixel(x,y+1); ct++; } if (ct>0) g /= ct; po.g = (int)g; } // B if (y%2==boff && x%2==boffx) { po.b = src.pixel(x,y); } else if (y%2==boff) { float b = 0; int ct = 0; if (x>0) { b += src.pixel(x-1,y); ct++; } if (x<w-1) { b += src.pixel(x+1,y); ct++; } if (ct>0) b /= ct; po.b = (int)b; } else if (x%2==boffx) { float b = 0; int ct = 0; if (y>0) { b += src.pixel(x,y-1); ct++; } if (y<h-1) { b += src.pixel(x,y+1); ct++; } if (ct>0) b /= ct; po.b = (int)b; } else { float b = 0; int ct = 0; if (x>0&&y>0) { b += src.pixel(x-1,y-1); ct++; } if (x>0&&y<h-1) { b += src.pixel(x-1,y+1); ct++; } if (x<w-1&&y>0) { b += src.pixel(x+1,y-1); ct++; } if (x<w-1&&y<h-1) { b += src.pixel(x+1,y+1); ct++; } if (ct>0) b /= ct; po.b = (int)b; } // R if (y%2==roff && x%2==roffx) { po.r = src.pixel(x,y); } else if (y%2==roff) { float r = 0; int ct = 0; if (x>0) { r += src.pixel(x-1,y); ct++; } if (x<w-1) { r += src.pixel(x+1,y); ct++; } if (ct>0) r /= ct; po.r = (int)r; } else if (x%2==roffx) { float r = 0; int ct = 0; if (y>0) { r += src.pixel(x,y-1); ct++; } if (y<h-1) { r += src.pixel(x,y+1); ct++; } if (ct>0) r /= ct; po.r = (int)r; } else { float r = 0; int ct = 0; if (x>0&&y>0) { r += src.pixel(x-1,y-1); ct++; } if (x>0&&y<h-1) { r += src.pixel(x-1,y+1); ct++; } if (x<w-1&&y>0) { r += src.pixel(x+1,y-1); ct++; } if (x<w-1&&y<h-1) { r += src.pixel(x+1,y+1); ct++; } if (ct>0) r /= ct; po.r = (int)r; } } } return true; }
void TestFrameGrabber::createTestImage(yarp::sig::ImageOf<yarp::sig::PixelRgb>& image) { // to test IPreciselyTimed, make timestamps be mysteriously NNN.NNN42 double t = Time::now(); t -= ((t*1000)-(int)t)/1000; t+= 0.00042; stamp.update(t); if (background.width()>0) { image.copy(background); } else { image.zero(); image.resize(w,h); } switch (mode) { case VOCAB_BALL: { addCircle(image,PixelRgb(0,255,0),bx,by,15); addCircle(image,PixelRgb(0,255,255),bx,by,8); if (ct%5!=0) { rnd *= 65537; rnd += 17; bx += (rnd%5)-2; rnd *= 65537; rnd += 17; by += (rnd%5)-2; } else { int dx = w/2 - bx; int dy = h/2 - by; if (dx>0) { bx++; } if (dx<0) { bx--; } if (dy>0) { by++; } if (dy<0) { by--; } } } break; case VOCAB_GRID: { int ww = image.width(); int hh = image.height(); if (ww>1&&hh>1) { for (int x=0; x<ww; x++) { for (int y=0; y<hh; y++) { double xx = ((double)x)/(ww-1); double yy = ((double)y)/(hh-1); int r = int(0.5+255*xx); int g = int(0.5+255*yy); bool act = (y==ct); image.pixel(x,y) = PixelRgb(r,g,act*255); } } } } break; case VOCAB_LINE: default: { for (int i=0; i<image.width(); i++) { image.pixel(i,ct).r = 255; } } break; case VOCAB_RAND: { // from Alessandro Scalzo static unsigned char r=128,g=128,b=128; int ww = image.width(); int hh = image.height(); if (ww>1&&hh>1) { for (int x=0; x<ww; x++) { for (int y=0; y<hh; y++) { //r+=(rand()%3)-1; //g+=(rand()%3)-1; //b+=(rand()%3)-1; r += Random::uniform(-1,1); g += Random::uniform(-1,1); b += Random::uniform(-1,1); image.pixel(x,y) = PixelRgb(r,g,b); } } } } break; case VOCAB_NONE: break; } ct++; if (ct>=image.height()) { ct = 0; } if (by>=image.height()) { by = image.height()-1; } if (bx>=image.width()) { bx = image.width()-1; } if (bx<0) bx = 0; if (by<0) by = 0; }