void operator()(const cv::Mat& image,bool record) { // no image no fun if (image.empty()) return; int cF = currentFrame ? 1 : 0; int pF = currentFrame ? 0 : 1; // resize the image cv::resize(image,frames[cF],cv::Size(image.cols*scale,image.rows*scale),0,0,cv::INTER_LINEAR); std::cout << "Current: " << cF << " Previous: " << pF << std::endl; std::cout << "Image " << image.size() << " c:" << image.channels() << " > " << frames[cF].size() << std::endl; if (record && !output.isOpened()) { // fourcc int fourCC = FourCC<'X','V','I','D'>::value; // set framerate to 1fps - easier to check in a standard video player if (output.open("flow.avi",fourCC,25,frames[cF].size(),false)) { std::cout << "capture file opened" << std::endl; } } // make a copy for the initial frame if (frames[pF].empty()) frames[cF].copyTo(frames[pF]); if (!flow.empty()) flow = cv::Mat::zeros(flow.size(),flow.type()); // calculate dense optical flow cv::calcOpticalFlowFarneback(frames[pF],frames[cF],flow,.5,2,8,3,7,1.5,0); // we can't draw into the frame! cv::Mat outImg = frames[cF].clone(); drawOptFlowMap(flow,outImg,8,cv::Scalar::all(255)); cv::imshow("Flow",outImg); // flip the buffers currentFrame = !currentFrame; // record the frame if (record && output.isOpened()) output.write(outImg); }
~DetectFromVideo() { if (vWriter.isOpened()) { vWriter.release(); } };
/** * Callback function for the rgb image. Saves each image received * as a message on the rgb video, using the rgb video writer. * * @param msg a ROS image message. */ void rgbCallback(const sensor_msgs::ImageConstPtr &msg) { cv_bridge::CvImagePtr cv_ptr; // Copies the image data to cv_ptr and handles exceptions try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception &e) { ROS_ERROR("cv_bridge exception: %s", e.what()); return; } // Check for invalid image if (!(cv_ptr->image.rows) || !(cv_ptr->image.cols)) { ROS_ERROR("cv_ptr error: invalid image frame received"); exit(-1); } // Opens the rgb video writer if it's not opened yet. if (!is_open_rgb) { std::string rgb_name = ros::package::getPath("vision") + "/data/rgb_video.avi"; rgb_writer.open(rgb_name.c_str(), CV_FOURCC('P','I','M','1'), 25, cv::Size(cv_ptr->image.cols, cv_ptr->image.rows),true); if (!rgb_writer.isOpened()) ROS_ERROR("Error! Could not open rgb video writer!"); else is_open_rgb = true; } rgb_writer << cv_ptr->image; // Saves the rgb image on the rgb video. }
bool recordColor(const QString& file, int fourcc) { //const int fourcc = CV_FOURCC('L', 'A', 'G', 'S'); //const int fourcc = CV_FOURCC('X', '2', '6', '4'); //const int fourcc = CV_FOURCC('Z', 'L', 'I', 'B'); //const int fourcc = CV_FOURCC('M', 'J', 'P', 'G'); //const int fourcc = CV_FOURCC_PROMPT; //const int fourcc = CV_FOURCC('H', 'F', 'Y', 'U'); //int fourcc = CV_FOURCC('H', 'F', 'Y', 'U'); colorFile = (file + ".avi").toStdString(); colorWriter.open( colorFile, fourcc, 30.0, cv::Size(ColorFrame::WIDTH, ColorFrame::HEIGHT), true ); if (colorWriter.isOpened()) { colorBuffer.create(cv::Size(ColorFrame::WIDTH, ColorFrame::HEIGHT), CV_8UC3); colorFrame = new ColorFrame(); return true; } colorFile.clear(); return false; }
bool recordDepth(const QString& file, int fourcc) { depthFile = (file + ".avi").toStdString(); depthWriter.open( depthFile, fourcc, 30.0, cv::Size(DepthFrame::WIDTH, DepthFrame::HEIGHT), true ); if (depthWriter.isOpened()) { depthBuffer.create(cv::Size(DepthFrame::WIDTH, DepthFrame::HEIGHT), CV_8UC3); depthFrame = new DepthFrame(); return true; } depthFile.clear(); return false; }
/** 動画ファイルに書き込み */ bool write(){ if( videoWriter.isOpened()){ cv::Size size = cv::Size(glutGet(GLUT_WINDOW_WIDTH),glutGet( GLUT_WINDOW_HEIGHT)); if(size.width == captureImage.cols && size.height == captureImage.rows){ #ifndef USE_TEXTURE_2D glReadPixels(0,0, captureImage.cols,captureImage.rows,GL_RGB,GL_UNSIGNED_BYTE,captureImage.data); #else glCopyTexImage2D( GL_TEXTURE_2D,0,GL_RGB,0,0,captureImage.cols,captureImage.rows,0); glGetTexImage(GL_TEXTURE_2D,0,GL_RGB,GL_UNSIGNED_BYTE,captureImage.data); #endif } else{ //ウィンドウが拡大縮小されている場合 size.width -= size.width % 4; //4の倍数にする cv::Mat temp(size,CV_8UC3); #ifndef USE_TEXTURE_2D glReadPixels(0,0, size.width,size.height,GL_RGB,GL_UNSIGNED_BYTE,temp.data); #else glCopyTexImage2D( GL_TEXTURE_2D,0,GL_RGB,0,0,size.width,size.height,0); glGetTexImage(GL_TEXTURE_2D,0,GL_RGB,GL_UNSIGNED_BYTE,temp.data); #endif cv::resize(temp,captureImage,captureImage.size(),0.0,0.0,interpolation); } cvtColor(captureImage,captureImage,CV_RGB2BGR); flip(captureImage,captureImage,0); videoWriter << captureImage; //char key = cv::waitKey(1); //std::ostringstream oss; //oss << name << count << ".bmp"; //if(key == 's'){ // cv::imwrite(oss.str(), captureImage); // count++; //} return true; } else return false; }