I have been associated with an image processing group for some time that is doing research on background/foreground segmentation using neural networks. I might soon add a publication (depending if we get it done on time) on pixel-wise based segmentation. Here’s a function which takes an array of video files, and exports their pixels, one each line, into a file with a given separator. It is interesting to apply unsupervised learning alghoritms on the resulting set. Link to source. Written in C.
#include <stdlib.h> #include <stdio.h> #include <cv.h> #include <highgui.h> /* * Function extracts pixel values from video, frame by frame and writes them into a file * videos - array of file names to be read * outputFilename - output file * separator - value separator * normalize - if 1 normalize the RGB values to [0, 1] interval else values stay in [0, 255] */ int extractPixelsFromVideo(char** videos, char* outputFilename, char* separator, int normalize) { // Open the file for writing the pixel values into FILE *ofp; char mode[] = "w"; ofp = fopen(outputFilename, mode); if (ofp == NULL) { printf("Can't open output file %s!\n", outputFilename); exit(1); } // Normalize the pixel values to the [0, 1] interval int divisor; if (normalize == 1) { divisor = 255; } else { divisor = 1; } // Declare the structure that holds the video CvCapture* capture = 0; // Declare the structure that holds the frames IplImage* img = 0; // Number of elements in the video array int videoCount = sizeof(videos) / sizeof(char*); // Pixel counter, and for iterator int count = 0; // Loop through videos and get the pixel values for (int i = 0; i < videoCount; i++) { // Open video CvCapture* capture = cvCaptureFromAVI(videos[i]); printf("%s\n", videos[i]); // Grab the frames 1 by 1 while (cvGrabFrame(capture) != 0) { // Retrieve the captured frame img = cvRetrieveFrame(capture); // String that keeps the pixel values to be written char special[200]; // Iterate through the image and pick the RGB values of each pixel for (int j = 0; j < img -> height; j++) { for (int k = 0; k < img -> width; k++) { // Get the (i,j) pixel value CvScalar s; s = cvGet2D(img, j, k); // Format the string to be written sprintf(special, "%f%s%f%s%f\n", s.val[0] / divisor, separator, s.val[1] / divisor, separator, s.val[2] / divisor); // Write the pixel values and count it fprintf(ofp, "%s", special); count++; } } } } // Free resources cvReleaseImage(&img); cvReleaseCapture(&capture); fclose(ofp); // This part only works on UNIX, and it writes the total number of pixels // at the beggining of the file (uncomment if needed) /* char systemRun[200]; sprintf(systemRun, "sed -i '1i %d' %s", count, outputFilename); system(systemRun); */ return 0; }
I enjoy, lead to I discovered just what I used to be looking for.
You’ve ended my 4 day lengthy hunt! God Bless you man. Have a nice day. Bye