void PipelineStabDetect::onInput(InputImageInfo info, Magick::Image image) { try { if (!initialized) { init(image); } if (image.rows() != height || image.columns() != width) { throw runtime_error(QString("Not uniform image size! %").arg(info.file.fileName()).toStdString()); } Magick::Blob blob; // set raw RGBS output format & convert it into a Blob if (image.depth() > 8) *err << "Warning: we lost some information by converting to 8bit depth (now " << image.depth() << ")" << endl; image.depth(8); image.magick("RGB"); image.write(&blob); LocalMotions localmotions; VSFrame frame; size_t dataLen = blob.length(); Q_ASSERT(fi.planes == 1); Q_ASSERT(dataLen == image.baseColumns() * image.baseRows() * 3); if (stabConf->mdConf.show > 0) { // create copy of blob frame.data[0] = new uint8_t[dataLen]; memcpy(frame.data[0], blob.data(), dataLen); } else { frame.data[0] = (uint8_t*) blob.data(); } frame.linesize[0] = image.baseColumns() * 3; if (vsMotionDetection(&md, &localmotions, &frame) != VS_OK) { throw runtime_error("motion detection failed"); } else { if (vsWriteToFile(&md, f, &localmotions) != VS_OK) { throw runtime_error("cannot write to transform file"); } vs_vector_del(&localmotions); } if (stabConf->mdConf.show > 0) { // if we want to store transformations, we have to create new image... Magick::Geometry g(width, height); Magick::Blob oblob(frame.data[0], dataLen); Magick::Image oimage; oimage.read(oblob, g, 8, "RGB"); delete[] frame.data[0]; emit input(info, oimage); } else { emit input(info, image); } } catch (exception &e) { emit error(e.what()); } }
bool ResourceManager::AddImage(const boost::filesystem::path& path, const std::string& imgname, const float width, const float height, const std::string& key) { if(!boost::filesystem::is_regular_file(path/imgname)) { Logger::Critical(LogOrigin::RESOURCEMANAGER, "Tried loading image path'"+(path/imgname).string()+"' but this image path doesn't exist!"); exit(1); } // create Original file path std::string originalFile = (path / imgname).string(); // if the optional param key is not given, use the basename as key std::string image_key = ""; if(key == "") { image_key = boost::filesystem::basename(originalFile); } else { image_key = key; } // Create Cache Paths boost::filesystem::path cacheDir = (path / "cached").string(); std::string cacheFile = (cacheDir / image_key ).string()+".png"; // if an image with that key already exists in the dictionary, return if(mImages.count(image_key) != 0) { return true; } // Log output Logger::Debug(LogOrigin::RESOURCEMANAGER, "Caching image " + originalFile); // Create cache directory boost::filesystem::create_directory(cacheDir.string()); // Load, convert and save image (originalFile > cacheFile) Magick::Image mimage; mimage.backgroundColor(Magick::Color(0, 0, 0, 65535)); mimage.density(Magick::Geometry(144, 144)); mimage.read(originalFile); // Conver floats to view pixels so that images will always be at the same scale const Vector2D vec(Coordinates::WorldFloatToWorldPixel(Vector2D(width, height))); mimage.zoom(Magick::Geometry(vec.x, vec.y)); mimage.depth(8); mimage.write(cacheFile); // Load cached file sf::Image sfimage; sfimage.LoadFromFile(cacheFile); sfimage.SetSmooth(true); // Save loaded Image in Dictionary // mImages.insert(new std::pair<std::string, sf::Image>(image_key, sfimage)); mImages[image_key] = sfimage; 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(); }
void DrvSDL::WriteGif() { std::list<Magick::Image> gif; int num = 0; for(std::list<Magick::Blob>::iterator it = image_.begin(); it != image_.end(); it++) { Magick::Image image; image.magick("RGB"); image.depth(32); image.size(Magick::Geometry(cols_ * pixels.x, rows_ * pixels.y)); Magick::PixelPacket *pixel_cache = image.getPixels(0, 0, cols_ * pixels.x, rows_ * pixels.y); for(int n = 0; n < rows_ * pixels.y * cols_ * pixels.x; n++) { int col = ((int *)(*it).data())[n]; uint8_t *rgb = (uint8_t *) &col; Magick::PixelPacket *gif_pixel = pixel_cache + n; *gif_pixel = Magick::ColorRGB(rgb[0] / 256.0, rgb[1] / 256.0, rgb[2] / 256.0); } image.syncPixels(); gif.push_back(image); LCDInfo("Image %d", num++); } LCDInfo("Writing GIF image..."); for_each(gif.begin(), gif.end(), Magick::animationDelayImage(ani_speed_ / 10)); Magick::writeImages(gif.begin(), gif.end(), gif_file_); }
bool ResourceManager::AddTexture(const boost::filesystem::path& path, const std::string& imgname, const float width, const float height) { if(!boost::filesystem::is_regular_file(path/imgname)) { std::cerr << "Tried loading image path '" << (path/imgname).string() << "' but this image path doesn't exist!" << std::endl; exit(1); } // convert coords const Vector2D size(Coordinates::WorldFloatToWorldPixel(Vector2D(width, height))); // create Original file path std::string originalFile = (path / imgname).string(); // if the optional param key is not given, use the basename as key std::string image_key = boost::filesystem::basename(originalFile); // Create Cache Paths boost::filesystem::path cacheDir = (path / "cached").string(); std::string cacheFile = (cacheDir / image_key ).string()+".png"; // if an image with that key already exists in the dictionary, return if(mTextures.count(image_key) != 0) { return true; } sf::Texture sftexture; bool cache = true; if(boost::filesystem::is_regular_file(cacheFile)) { // Load cached file bool success = sftexture.LoadFromFile(cacheFile); if (success && (int)sftexture.GetHeight() == (int)size.x && (int)sftexture.GetWidth() == (int)size.y) { cache = false; std::cout << "Texture " << originalFile << " already exists. Not caching. "<< std::endl; } else if (success) { std::cout << "Texture " << originalFile << " does not exist in the resolution " << size.x << "x" << size.y << " but in " << sftexture.GetHeight() << "x" << sftexture.GetWidth() << "." << std::endl; } } if(cache){ std::cout << ":: Caching image " << originalFile << std::endl; // Create cache directory boost::filesystem::create_directory(cacheDir.string()); // Load, convert and save image (originalFile > cacheFile) Magick::Image mimage; mimage.backgroundColor(Magick::Color(0, 0, 0, 65535)); mimage.density(Magick::Geometry(144, 144)); mimage.read(originalFile); mimage.zoom(Magick::Geometry(std::max(size.x,size.y), std::max(size.x,size.y))); mimage.depth(8); mimage.write(cacheFile); // Load cached file sftexture.LoadFromFile(cacheFile); } sftexture.SetSmooth(true); //std::cout << " Added image: "<<image_key << std::endl; // Save loaded Texture in Dictionary mTextures[image_key] = sftexture; return true; }
void Magick::depthImage::operator()( Magick::Image &image_ ) const { image_.depth( _depth ); }
void PipelineStabTransform::onInput(InputImageInfo info, Magick::Image image) { try { if (!initialized) { init(image); } if (image.rows() != height || image.columns() != width) { throw runtime_error(QString("Not uniform image size! %").arg(info.file.fileName()).toStdString()); } Q_ASSERT(image.baseColumns() == width && image.baseRows() == height); Magick::Blob blob; // set raw RGBS output format & convert it into a Blob if (image.depth() > 8) *err << "Warning: we lost some information by converting to 8bit depth (now " << image.depth() << ")" << endl; image.depth(8); image.magick("RGB"); image.write(&blob); Q_ASSERT(blob.length() == image.baseColumns() * image.baseRows() * 3); // inframe VSFrame inframe; size_t dataLen = blob.length(); inframe.data[0] = (uint8_t*) blob.data(); inframe.linesize[0] = image.baseColumns() * 3; // TODO: it is correct? // outframe uint8_t* data = new uint8_t[dataLen]; //memcpy(data, blob.data(), dataLen); VSFrame outframe; outframe.data[0] = data; outframe.linesize[0] = image.baseColumns() * 3; // TODO: it is correct? if (vsTransformPrepare(&td, &inframe, &outframe) != VS_OK) { throw runtime_error("Failed to prepare transform"); } Q_ASSERT(vsTransformGetSrcFrameInfo(&td)->planes == 1); vsDoTransform(&td, vsGetNextTransform(&td, &trans)); vsTransformFinish(&td); Magick::Geometry g(width, height); Magick::Blob oblob(data, dataLen); Magick::Image oimage; oimage.size(g); oimage.depth(8); oimage.magick("RGB"); oimage.read(oblob); delete[] data; info.luminance = -1; emit input(info, oimage); } catch (exception &e) { emit error(e.what()); } }
void scan_image (const char *filename) { scanner.reset(); // normally scanner would reset associated decoder, // but this debug program connects them manually // (to make intermediate state more readily available) // so decoder must also be reset manually decoder.reset(); Magick::Image image; image.read(filename); string file = image.baseFilename(); size_t baseidx = file.rfind('/'); if(baseidx != string::npos) file = file.substr(baseidx + 1, file.length() - baseidx - 1); ofstream svg((file + ".svg").c_str()); unsigned inwidth = image.columns(); unsigned flush1 = inwidth / 32; unsigned flush0 = 2; unsigned width = inwidth + flush1 + flush0; unsigned height = image.rows(); unsigned midy = (height + 1) / 2 + 2; image.crop(Magick::Geometry(inwidth, 1, 0, midy)); image.size(Magick::Geometry(width, 1, 0, 0)); svg << "<?xml version='1.0'?>" << endl << "<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN'" << " 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>" << endl << "<svg version='1.1' id='top'" << " width='10in' height='6in' preserveAspectRatio='xMinYMid slice'" << " overflow='visible' viewBox='0,0 " << width * 2 << ",384'" << " xmlns:xlink='http://www.w3.org/1999/xlink'" << " xmlns='http://www.w3.org/2000/svg'>" << endl << "<defs><style type='text/css'><![CDATA[" << endl << " * { stroke-linejoin: round; stroke-linecap: round;" << " stroke-width: .1; text-anchor: middle;" << " image-rendering: optimizeSpeed;" << " font-size: 6; font-weight: bold }" << endl << " path { fill: none }" << endl << " #zero { stroke: #00f }" << endl << " #edges { stroke: #f00 }" << endl << " #cur-edge { stroke: #f44 }" << endl << " #raw { stroke: orange }" << endl << " #y0 { stroke: yellow }" << endl << " #y1 { stroke: #0c0 }" << endl << " #y2 { stroke: #0aa }" << endl << " .y1thr { stroke: #f0f }" << endl << " rect.bar { fill: black }" << endl << " text.bar { fill: white }" << endl << " rect.space { fill: white }" << endl << " text.space { fill: black }" << endl << " text.data { fill: #44f; font-size: 16 }" << endl << "]]></style></defs>" << endl << "<image width='" << width * 2 << "' height='384'" << " preserveAspectRatio='none'" << " xlink:href='" << file << ".png'/>" << endl << "<g transform='translate(1,384) scale(2,-.5)'>" << endl; // brute force unsigned raw[width]; { // extract scan from image pixels image.modifyImage(); Magick::Pixels view(image); Magick::PixelPacket *pxp = view.get(0, 0, width, 1); Magick::ColorYUV y; double max = 0; svg << "<path id='raw' d='M"; unsigned i; for(i = 0; i < inwidth; i++, pxp++) { y = *pxp; if(max < y.y()) max = y.y(); raw[i] = (unsigned)(y.y() * 0x100); svg << ((i != 1) ? " " : " L ") << i << "," << raw[i]; y.u(0); y.v(0); *pxp = y; } y.y(max); /* flush scan FIXME? */ for(; i < inwidth + flush1; i++) { raw[i] = (unsigned)(y.y() * 0x100); svg << " " << i << "," << raw[i]; *pxp++ = y; } y.y(0); for(; i < width; i++) { raw[i] = (unsigned)(y.y() * 0x100); svg << " " << i << "," << raw[i]; *pxp++ = y; } view.sync(); svg << "'/>" << endl << "</g>" << endl; } image.depth(8); image.write(file + ".png"); // process scan and capture calculated values unsigned cur_edge[width], last_edge[width]; int y0[width], y1[width], y2[width], y1_thr[width]; svg << "<g transform='translate(-3)'>" << endl; for(unsigned i = 0; i < width; i++) { int edge = scanner.scan_y(raw[i]); unsigned x; zbar_scanner_get_state(scanner.get_c_scanner(), &x, &cur_edge[i], &last_edge[i], &y0[i], &y1[i], &y2[i], &y1_thr[i]); #ifdef DEBUG_SCANNER cerr << endl; #endif cur_edge[i] += i - x; if(edge) { last_edge[i] += i - x; unsigned w = scanner.get_width(); svg << "<rect x='" << (2. * (last_edge[i] - w) / ZBAR_FRAC) << "' width='" << (w * 2. / ZBAR_FRAC) << "' height='32' class='" << (scanner.get_color() ? "space" : "bar") << "'/>" << endl << "<text transform='translate(" << ((2. * last_edge[i] - w) / ZBAR_FRAC) - 3 << ",16) rotate(90)' class='" << (scanner.get_color() ? "space" : "bar") << "'>" << endl << w << "</text>" << endl; zbar_symbol_type_t sym = decoder.decode_width(w); if(sym > ZBAR_PARTIAL) { svg << "<text transform='translate(" << (2. * (last_edge[i] + w) / ZBAR_FRAC) << ",208) rotate(90)' class='data'>" << decoder.get_data_string() << "</text>" << endl; } } else last_edge[i] = 0; } svg << "</g>" << endl << "<g transform='translate(-3,384) scale(2,-.5)'>" << endl << "<path id='edges' d='"; for(unsigned i = 0; i < width; i++) if(last_edge[i]) svg << " M" << ((double)last_edge[i] / ZBAR_FRAC) << ",0v768"; svg << "'/>" << endl << "</g>" << endl << "<g transform='translate(-1,384) scale(2,-.5)'>" << endl << "<path id='y0' d='M"; for(unsigned i = 0; i < width; i++) svg << ((i != 1) ? " " : " L ") << i << "," << y0[i]; svg << "'/>" << endl << "</g>" << endl; svg << "<g transform='translate(-1,128) scale(2,-1)'>" << endl << "<line id='zero' x2='" << width << "'/>" << endl << "<path id='cur-edge' d='"; for(unsigned i = 1; i < width - 1; i++) if(!last_edge[i + 1] && (cur_edge[i] != cur_edge[i + 1])) svg << " M" << ((double)cur_edge[i] / ZBAR_FRAC) - 1 << ",-32v64"; svg << "'/>" << endl << "<path class='y1thr' d='M"; for(unsigned i = 0; i < width; i++) svg << ((i != 1) ? " " : " L ") << i << "," << y1_thr[i]; svg << "'/>" << endl << "<path class='y1thr' d='M"; for(unsigned i = 0; i < width; i++) svg << ((i != 1) ? " " : " L ") << i << "," << -y1_thr[i]; svg << "'/>" << endl << "<path id='y1' d='M"; for(unsigned i = 0; i < width; i++) svg << ((i != 1) ? " " : " L ") << (i - 0.5) << "," << y1[i]; svg << "'/>" << endl << "<path id='y2' d='M"; for(unsigned i = 0; i < width; i++) svg << ((i != 1) ? " " : " L ") << i << "," << y2[i]; svg << "'/>" << endl << "</g>" << endl; svg << "</svg>" << endl; }