void aplicar_original (const char *archivo_entrada, bool verbose, bool frames, const char *carpeta_frames){ static size_t bufsize = 1024; char namebuff[bufsize + 1]; const char *filename = basename(archivo_entrada); CvCapture *srcVid = abrir_video(archivo_entrada); CvSize dst_size; dst_size.width = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FRAME_WIDTH); dst_size.height = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FRAME_HEIGHT); double fps = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FPS); typedef struct CvVideoWriter CvVideoWriter; snprintf(namebuff, bufsize, "%s.original.avi", archivo_entrada); printf("\n\n%s\n\n",namebuff); CvVideoWriter* dstVid = abrir_writer(namebuff, fps, dst_size); if (verbose) { cvNamedWindow("procesanding", CV_WINDOW_AUTOSIZE); } unsigned int framenum = 0; while(1) { /* Capturo un frame */ IplImage *frame = cvQueryFrame(srcVid); framenum ++; if(framenum==100)break; cvWriteFrame(dstVid, frame); if (frames) { /* Escribo el frame */ snprintf(namebuff, bufsize, "%s/%s.original.%d.bmp", carpeta_frames, filename, framenum); cvSaveImage(namebuff, frame, NULL); } if (verbose) { cvShowImage("procesanding", frame); cvWaitKey(1); } } if (verbose) { cvDestroyWindow("procesanding"); } cvReleaseVideoWriter(&dstVid); cvReleaseCapture(&srcVid); }
void aplicar_filtro_color (const char *implementacion, const char *archivo_entrada, bool verbose, bool frames, const char *carpeta_frames, int rc, int gc, int bc, int threshold) { static size_t bufsize = 1024; char namebuff[bufsize + 1]; const char *filename = basename(archivo_entrada); CvCapture *srcVid = abrir_video(archivo_entrada); CvSize dst_size; dst_size.width = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FRAME_WIDTH); dst_size.height = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FRAME_HEIGHT); double fps = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FPS); int nchannels = 3; typedef struct CvVideoWriter CvVideoWriter; CvVideoWriter* dstVid = NULL; if (!frames) { snprintf(namebuff, bufsize, "%s.fcolor.avi", archivo_entrada); dstVid = abrir_writer(namebuff, fps, dst_size); } /* Armo la imagen destino. */ IplImage *dst = NULL; dst = cvCreateImage (dst_size, IPL_DEPTH_8U, nchannels); if (dst == NULL) { fprintf(stderr, "Error armando la imagen destino\n"); exit(EXIT_FAILURE); } if (verbose) { cvNamedWindow("procesanding", CV_WINDOW_AUTOSIZE); } unsigned int framenum = 0; FILE* f = fopen(COLOR_TIEMPOS, "a"); int iteraciones = 1; long int total = 0; while(1) { /* Capturo un frame */ IplImage *frame = cvQueryFrame(srcVid); framenum ++; if (frame == NULL) { break; } /* Aplico el filtro */ typedef void (fcolor_fn_t) (unsigned char*, unsigned char*, unsigned char, unsigned char, unsigned char, int, int, int); fcolor_fn_t *proceso; if (strcmp(implementacion, "c") == 0) { proceso = color_filter_c; } else { proceso = color_filter_asm; } int stop = 0; int start = 0; int tiempo = 0; MEDIR_TIEMPO_START(start); proceso((unsigned char *) frame->imageData, (unsigned char *) dst->imageData, rc, gc, bc, threshold, frame->height, frame->width); MEDIR_TIEMPO_STOP(stop); tiempo = stop - start; total = tiempo + total; fprintf(f, "%d %d %ld\n", iteraciones, tiempo, total); iteraciones ++; if (frames) { /* Escribo el frame */ snprintf(namebuff, bufsize, "%s/%s.fcolor.%d.bmp", carpeta_frames, filename, framenum); cvSaveImage(namebuff, dst, NULL); } else { cvWriteFrame(dstVid, dst); } if (verbose) { cvShowImage("procesanding", dst); cvWaitKey(1); } } FILE* g = fopen(COLOR_TOTALES, "a"); fprintf(g,"%ld\n", total); fclose(g); promedio = promedio + (total / global); fclose(f); if (verbose) { cvDestroyWindow("procesanding"); } cvReleaseImage(&dst); if (!frames) { cvReleaseVideoWriter(&dstVid); } cvReleaseCapture(&srcVid); }
void FileToVideo(const char *archivo_entrada, Video& video, const string carpeta_frames, const bool saveFrames, uint frame_drop) { CvCapture *srcVid = abrir_video(archivo_entrada); CvSize dst_size; dst_size.width = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FRAME_WIDTH); dst_size.height = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FRAME_HEIGHT); double fps = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FPS); video.frame_height = dst_size.height; #ifdef COLOR_PROCESSING uint nchannels = 3; video.frame_width = dst_size.width * nchannels; #else video.frame_width = dst_size.width; #endif video.frame_rate = fps; uint frame_count = 0; while( true ) { IplImage *cvFrame = cvQueryFrame(srcVid); if (cvFrame == NULL) { break; } if(frame_count % (frame_drop+1) != 0){ frame_count++; continue; } // cout << "Leyendo frame " << frame_count << endl; #ifdef COLOR_PROCESSING // Save frame bmp to carpeta_frames folder. if(saveFrames) { string str_frame = carpeta_frames; str_frame+= "/"; str_frame+= "frame_"; str_frame+= to_string(frame_count+1); str_frame+= ".bmp"; cvSaveImage(str_frame.c_str(), cvFrame, NULL); } #else IplImage *cvBWFrame = cvCreateImage(cvGetSize(cvFrame), IPL_DEPTH_8U, 1); cvCvtColor(cvFrame, cvBWFrame, CV_BGR2GRAY); // Save frame bmp to carpeta_frames folder. if(saveFrames) { string str_frame = carpeta_frames; str_frame+= "/"; str_frame+= "frame_"; str_frame+= to_string(frame_count+1); str_frame+= ".bmp"; cvSaveImage(str_frame.c_str(), cvBWFrame, NULL); } #endif // Load new frame #ifdef COLOR_PROCESSING unsigned char *src = (unsigned char *) cvFrame->imageData; #else unsigned char *src = (unsigned char *) cvBWFrame->imageData; #endif uint idx_src=0; // Reserve memory for <video.frame_height> pixel rows frame_t frame; frame.resize(video.frame_height); for (uint i = 0; i < video.frame_height; i++) { // Reserve memory for <video.frame_width> pixels per row frame[i].resize(video.frame_width); for (uint j = 0; j < video.frame_width; j++) { frame[i][j] = src[idx_src++]; } } video.frames.push_back(frame); frame_count++; } video.frame_count = video.frames.size(); cvReleaseCapture(&srcVid); }