added canny edge
authorCallum <callum@callum-ubuntu.(none)>
Sun, 20 Oct 2013 10:14:41 +0000 (18:14 +0800)
committerCallum <callum@callum-ubuntu.(none)>
Sun, 20 Oct 2013 10:14:41 +0000 (18:14 +0800)
server/dilatometer.c

index 34fc89c..5cfca0a 100644 (file)
 // test positions
 static double test_left, test_right;
 
+// Canny Edge algorithm variables
+int edgeThresh = 1;
+int lowThreshold;
+int const max_lowThreshold = 100;
+int ratio = 3;
+int kernel_size = 3;
+
 /** Buffer for storing image data. Stored as a  **/
-static CvMat * g_data = NULL;
+static CvMat * g_srcRGB  = NULL; // Source Image
+static CvMat * g_srcGray = NULL; // Gray scale of source image
+static CvMat * g_edges          = NULL; // Detected Edges
+static CvMat * g_data    = NULL; // Image to mask edges onto
 
 
 /** Camera capture pointer **/
@@ -24,8 +34,7 @@ static CvCapture * g_capture = NULL;
 void Dilatometer_TestImage()
 {
        
-       CvMat *g_dataRGB;
-       g_dataRGB = cvCreateMat(480, 640, CV_8UC3);
+       g_srcRGB = cvCreateMat(480, 640, CV_8UC3);
 
        for( int x = 0; x < 640; ++x)
        {
@@ -46,7 +55,7 @@ void Dilatometer_TestImage()
                                else
                                        s.val[i] *= exp( (test_right - x) / 25);                                
                        }       
-                       cvSet2D(g_dataRGB,y,x,s);
+                       cvSet2D(g_srcRGB,y,x,s);
                //      if( s.val[0] > 200)
                //              printf("row: %d, col: %d, %f\n", y, x, s.val[0]); 
                }
@@ -54,9 +63,9 @@ void Dilatometer_TestImage()
        }
        if (g_data == NULL)
        {
-               g_data = cvCreateMat(g_dataRGB->rows,g_dataRGB->cols,CV_8UC1); //IPL_DEPTH_8U?
+               g_data = cvCreateMat(g_srcRGB->rows,g_srcRGB->cols,CV_8UC1); //IPL_DEPTH_8U?
        }
-       cvCvtColor(g_dataRGB,g_data,CV_RGB2GRAY);
+       cvCvtColor(g_srcRGB,g_data,CV_RGB2GRAY);
 }      
 
 /**
@@ -90,11 +99,47 @@ static void Dilatometer_GetImage()
        //Need to implement camera
 }
 
+void CannyThreshold()
+{
+       
+       if (g_data == NULL)
+       {
+               g_data = cvCreateMat(g_srcGray->rows,g_srcGray->cols,CV_8UC1);
+       }
+
+       if ( g_edges == NULL)
+       {
+               g_edges = cvCreateMat(g_srcGray->rows,g_srcGray->cols,CV_8UC1);
+       }
+       
+       //g_data = 0;
+       cvShowImage("display", g_srcGray);
+       cvWaitKey(0);   
+       // Reduce noise with a kernel 3x3. Input the grayscale source image, output to edges. (0's mean it's determined from kernel sizes)
+       cvSmooth( g_srcGray, g_edges, CV_GAUSSIAN, 9, 9 ,0 ,0 );
+       
+       cvShowImage("display", g_edges);
+       cvWaitKey(0);   
+
+       // Find the edges in the image
+       cvCanny( g_edges, g_edges, lowThreshold, lowThreshold*ratio, kernel_size );
+
+       cvShowImage("display", g_edges);
+       cvWaitKey(0);   
+       
+       // Mask the edges over G_data
+       //.copyTo( g_data, g_edges);
+}
+
 // Test algorithm
 static void Dilatometer_GetImageTest( )
 {      
-       //Test image
-       Dilatometer_TestImage();
+       //Generates Test image
+       //Dilatometer_TestImage();
+       
+       //Load Test image
+       g_srcGray = cvLoadImageM ("testimage.jpg",CV_LOAD_IMAGE_GRAYSCALE );
+       CannyThreshold();
 }
 
 
@@ -104,14 +149,14 @@ static void Dilatometer_GetImageTest( )
  * @returns the average width of the can
  */
 double Dilatometer_Read(int samples)
-{
+{      
        //Get the latest image
        //Dilatometer_GetImage();
 
        Dilatometer_GetImageTest();
        
-       int width = g_data->cols;
-       int height = g_data->rows;
+       int width = g_srcGray->cols;
+       int height = g_srcGray->rows;
        // If the number of samples is greater than the image height, sample every row
        if( samples > height)
        {
@@ -135,13 +180,13 @@ double Dilatometer_Read(int samples)
                sample_height = ceil(height * (i + 1) / samples) -1;
                //printf("sample height is %d\n", sample_height);
 
-               //CvScalar test = cvGet2D(g_data, 150,300);
+               //CvScalar test = cvGet2D(g_srcGray, 150,300);
                //printf("test is %f,%f,%f,%f\n", test.val[0], test.val[1], test.val[2], test.val[3]);
 
 
                for ( int col = 0; col < width; col++)
                {
-                       CvScalar value = cvGet2D(g_data, sample_height, col);
+                       CvScalar value = cvGet2D(g_srcGray, sample_height, col);
                        if( value.val[0]> THRES)
                        {
                                edges[pos] += (double) col;
@@ -180,11 +225,11 @@ int main(int argc, char ** argv)
        test_right = 500;
        Dilatometer_Init();
 
-       cvNamedWindow( "display", CV_WINDOW_AUTOSIZE);
-       cvShowImage("display", g_data);
-       cvWaitKey(0);   
+//     cvNamedWindow( "display", CV_WINDOW_AUTOSIZE);
+//     cvShowImage("display", g_data);
+//     cvWaitKey(0);   
        double width;
-       for( int i = 0; i < 20; ++i)
+       /*for( int i = 0; i < 20; ++i)
        {
                test_left  -= i * (rand() % 1000) * 1e-3;
                test_right += i * (rand() % 1000) * 1e-3;
@@ -203,11 +248,11 @@ int main(int argc, char ** argv)
 
                width = Dilatometer_Read(5);
                cvNamedWindow( "display", CV_WINDOW_AUTOSIZE);
-               cvShowImage("display", g_data);
+               cvShowImage("display", g_srcGray);
                cvWaitKey(0); 
                double expected = test_right - test_left;
                double perc = 100 * (expected - width) / expected;
                printf("%d: Left: %.4f.    Width: %.4f.\n  Right: %.4f. Expected: %.4f. Percentage: %.4f\n", i, test_left, width, test_right, expected, perc);
-       }
+       }*/
 }
 

UCC git Repository :: git.ucc.asn.au