185 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
	
	
#! /usr/bin/env octave
 | 
						|
 | 
						|
## import the necessary things for OpenCV
 | 
						|
addpath("/home/x/opencv2/interfaces/swig/octave");
 | 
						|
source("/home/x/opencv2/interfaces/swig/octave/PKG_ADD_template");
 | 
						|
debug_on_error(true);
 | 
						|
debug_on_warning(true);
 | 
						|
crash_dumps_octave_core (0)
 | 
						|
cv;
 | 
						|
highgui;
 | 
						|
 | 
						|
#############################################################################
 | 
						|
## definition of some constants
 | 
						|
 | 
						|
## how many bins we want for the histogram, and their ranges
 | 
						|
hdims = 16;
 | 
						|
hranges = {0, 180};
 | 
						|
 | 
						|
## ranges for the limitation of the histogram
 | 
						|
vmin = 10;
 | 
						|
vmax = 256;
 | 
						|
smin = 30;
 | 
						|
 | 
						|
## the range we want to monitor
 | 
						|
hsv_min = cv.cvScalar (0, smin, vmin, 0);
 | 
						|
hsv_max = cv.cvScalar (180, 256, vmax, 0);
 | 
						|
 | 
						|
#############################################################################
 | 
						|
## some useful functions
 | 
						|
 | 
						|
function rgb = hsv2rgb (hue)
 | 
						|
  global cv;
 | 
						|
  ## convert the hue value to the corresponding rgb value
 | 
						|
 | 
						|
  sector_data = [0, 2, 1; 1, 2, 0; 1, 0, 2; 2, 0, 1; 2, 1, 0; 0, 1, 2]+1;
 | 
						|
  hue *= 0.1 / 3;
 | 
						|
  sector = cv.cvFloor (hue);
 | 
						|
  p = cv.cvRound (255 * (hue - sector));
 | 
						|
  if (bitand(sector,1))
 | 
						|
    p = bitxor(p,255);
 | 
						|
  endif
 | 
						|
 | 
						|
  rgb = zeros(1,3);
 | 
						|
  rgb (sector_data (sector+1, 1)) = 255;
 | 
						|
  rgb (sector_data (sector+1, 2)) = 0;
 | 
						|
  rgb (sector_data (sector+1, 3)) = p;
 | 
						|
  
 | 
						|
  rgb = cv.cvScalar (rgb (3), rgb (2), rgb (1), 0);
 | 
						|
endfunction
 | 
						|
 | 
						|
#############################################################################
 | 
						|
## so, here is the main part of the program
 | 
						|
 | 
						|
## a small welcome
 | 
						|
printf("OpenCV Octave wrapper test\n");
 | 
						|
printf("OpenCV version: %s (%d, %d, %d)\n",
 | 
						|
       cv.CV_VERSION,cv.CV_MAJOR_VERSION,
 | 
						|
       cv.CV_MINOR_VERSION,cv.CV_SUBMINOR_VERSION);
 | 
						|
 | 
						|
## first, create the necessary windows
 | 
						|
highgui.cvNamedWindow ('Camera', highgui.CV_WINDOW_AUTOSIZE);
 | 
						|
highgui.cvNamedWindow ('Histogram', highgui.CV_WINDOW_AUTOSIZE);
 | 
						|
 | 
						|
## move the new window to a better place
 | 
						|
#highgui.cvMoveWindow ('Camera', 10, 40);
 | 
						|
#highgui.cvMoveWindow ('Histogram', 10, 270);
 | 
						|
 | 
						|
try
 | 
						|
  ## try to get the device number from the command line
 | 
						|
  device = int32 (argv(){1});
 | 
						|
  have_device = true;
 | 
						|
catch
 | 
						|
  ## no device number on the command line, assume we want the 1st device
 | 
						|
  device = -1;
 | 
						|
end_try_catch
 | 
						|
 | 
						|
## no argument on the command line, try to use the camera
 | 
						|
capture = highgui.cvCreateCameraCapture (device);
 | 
						|
 | 
						|
## set the wanted image size from the camera
 | 
						|
highgui.cvSetCaptureProperty (capture, \
 | 
						|
                              highgui.CV_CAP_PROP_FRAME_WIDTH, 320);
 | 
						|
highgui.cvSetCaptureProperty (capture, \
 | 
						|
                              highgui.CV_CAP_PROP_FRAME_HEIGHT, 240);
 | 
						|
 | 
						|
## create an image to put in the histogram
 | 
						|
histimg = cv.cvCreateImage (cv.cvSize (320,240), 8, 3);
 | 
						|
 | 
						|
## init the image of the histogram to black
 | 
						|
cv.cvSetZero (histimg);
 | 
						|
 | 
						|
## capture the 1st frame to get some propertie on it
 | 
						|
frame = highgui.cvQueryFrame (capture);
 | 
						|
 | 
						|
## get some properties of the frame
 | 
						|
frame_size = cv.cvGetSize (frame);
 | 
						|
 | 
						|
## compute which selection of the frame we want to monitor
 | 
						|
selection = cv.cvRect (0, 0, frame.width, frame.height);
 | 
						|
 | 
						|
## create some images usefull later
 | 
						|
hue = cv.cvCreateImage (frame_size, 8, 1);
 | 
						|
mask = cv.cvCreateImage (frame_size, 8, 1);
 | 
						|
hsv = cv.cvCreateImage (frame_size, 8, 3 );
 | 
						|
 | 
						|
## create the histogram
 | 
						|
hist = cv.cvCreateHist ({hdims}, cv.CV_HIST_ARRAY, {hranges}, 1);
 | 
						|
 | 
						|
while (1)  ## do forever
 | 
						|
  
 | 
						|
  ## 1. capture the current image
 | 
						|
  frame = highgui.cvQueryFrame (capture);
 | 
						|
  if (swig_this(frame)==0);
 | 
						|
    ## no image captured... end the processing
 | 
						|
    break
 | 
						|
  endif
 | 
						|
  
 | 
						|
  ## mirror the captured image
 | 
						|
  cv.cvFlip (frame, [], 1);
 | 
						|
 | 
						|
  ## compute the hsv version of the image 
 | 
						|
  cv.cvCvtColor (frame, hsv, cv.CV_BGR2HSV);
 | 
						|
 | 
						|
  ## compute which pixels are in the wanted range
 | 
						|
  cv.cvInRangeS (hsv, hsv_min, hsv_max, mask);
 | 
						|
 | 
						|
  ## extract the hue from the hsv array
 | 
						|
  cv.cvSplit (hsv, hue, [], [], []);
 | 
						|
 | 
						|
  ## select the rectangle of interest in the hue/mask arrays
 | 
						|
  hue_roi = cv.cvGetSubRect (hue, selection);
 | 
						|
  mask_roi = cv.cvGetSubRect (mask, selection);
 | 
						|
 | 
						|
  ## it's time to compute the histogram
 | 
						|
  cv.cvCalcHist (hue_roi, hist, 0, mask_roi);
 | 
						|
 | 
						|
  ## extract the min and max value of the histogram
 | 
						|
  [min_val, max_val, min_idx, max_idx] = cv.cvGetMinMaxHistValue (hist);
 | 
						|
 | 
						|
  ## compute the scale factor
 | 
						|
  if (max_val > 0)
 | 
						|
    scale = 255. / max_val;
 | 
						|
  else
 | 
						|
    scale = 0.;
 | 
						|
  endif
 | 
						|
 | 
						|
  ## scale the histograms
 | 
						|
  cv.cvConvertScale (hist.bins, hist.bins, scale, 0);
 | 
						|
 | 
						|
  ## clear the histogram image
 | 
						|
  cv.cvSetZero (histimg);
 | 
						|
 | 
						|
  ## compute the width for each bin do display
 | 
						|
  bin_w = histimg.width / hdims;
 | 
						|
  
 | 
						|
  for  (i=0:hdims-1)
 | 
						|
    ## for all the bins
 | 
						|
 | 
						|
    ## get the value, and scale to the size of the hist image
 | 
						|
    val = cv.cvRound (cv.cvGetReal1D (hist.bins, i)
 | 
						|
		      * histimg.height / 255);
 | 
						|
 | 
						|
    ## compute the color
 | 
						|
    color = hsv2rgb (i * 180. / hdims);
 | 
						|
 | 
						|
    ## draw the rectangle in the wanted color
 | 
						|
    cv.cvRectangle (histimg,
 | 
						|
		    cv.cvPoint (i * bin_w, histimg.height),
 | 
						|
		    cv.cvPoint ((i + 1) * bin_w, histimg.height - val),
 | 
						|
		    color, -1, 8, 0);
 | 
						|
 | 
						|
    ## we can now display the images
 | 
						|
    highgui.cvShowImage ('Camera', frame);
 | 
						|
    highgui.cvShowImage ('Histogram', histimg);
 | 
						|
  endfor
 | 
						|
 | 
						|
  ## handle events
 | 
						|
  k = highgui.cvWaitKey (5);
 | 
						|
 | 
						|
  if (k == 27)
 | 
						|
    ## user has press the ESC key, so exit
 | 
						|
    break;
 | 
						|
  endif
 | 
						|
endwhile
 |