none
assemblage fonction Sobel et fonction threshold opencv RRS feed

  • Question

  • Bonjour,

    Alors voilà j'ai deux fonctions que je souhaite assembler pour qu'elles s'executent l'une après l'autre, cela dit dans Visual Studio quand je lance le programme seul la première fonction se lance... Il semblerait qu'il s'agissent d'un probleme de conversion entre image IPL et image Mat mais après plusieurs essais je n'arrive toujours pas à faire fonctionner la deuxième fonction!!!

    Si quelqu'un a une idée il est le bienvenue (je copie le code actuel en dessous)

    #include <stdlib.h>
    #include "StdAfx.h"

    using namespace cv;

    /*************************************** FONCTION SOBEL ************************************************/

    /********************************* Fonction principale sobel *******************************************/

    int main( )
    {

        int height,width,step,step_mono,channels;          /*Here i have declared step_mono for handling the widthstep member of a monochrome image*/

        uchar *data,*data_mono;                            /*similarly data mono for handling the data of monochrome image*/

        int i,j,k;
      //Mat src;
      Mat src_gray;
      Mat grad;
      char* window_name = "Sobel Demo - Simple Edge Detector";
      int scale = 1;
      int delta = 0;
      int ddepth = CV_16S;

      int c;

    /// Load an image
    IplImage* frame=cvLoadImage("D:/Entwicklung/OpenCV/2010/test threshold/Release/sobel.bmp",1);

    if( frame == NULL )
    { return -1; }

    Mat src(frame);


      GaussianBlur(src, src, Size(3,3), 0, 0, BORDER_DEFAULT );

      /// Convert it to gray
      cvtColor( src, src_gray, CV_RGB2GRAY );

      /// Create window
      namedWindow( window_name, CV_WINDOW_AUTOSIZE );

      /// Generate grad_x and grad_y
      Mat grad_x, grad_y;
      Mat abs_grad_x, abs_grad_y;

      /// Gradient X
      //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_x, abs_grad_x );

      /// Gradient Y
      //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_y, abs_grad_y );

      /// Total Gradient (approximate)
      addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

      imshow( window_name, grad );
      waitKey(0);

      //Resultat de grad dans IPL ....
      //IplImage  mono_thres=cvCreateImage( cvGetSize(frame), 8, 1 );
     IplImage frame2(grad);     
     //Faire à la fin
     IplImage* mono_thres=cvCreateImage( cvGetSize(&frame2), 8, 1 );


        height = frame2.height;                           /*height is a member of IPLIMAGE structure and hence it comes handy like this in such situations, and same goes with below four statements*/
        width = frame2.width;
        step = frame2.widthStep;
        step_mono = mono_thres->widthStep;
        channels = frame2.nChannels;                      /*Number of channels in the image*/

        data = (uchar *)frame2.imageData;                 /*Image is treated as as unsigned char data hence we use an unsigned char pointer to point to the same*/
        cvNamedWindow("My Window", CV_WINDOW_AUTOSIZE );
        data_mono = (uchar *)mono_thres-> imageData;       /*data of mono image is handled by the data_mono*/
     
        for(i=0;i < height;i++) for(j=0;j < width;j++)      /*I am copying the first channel from the image in "frame" in the monochrome image with the help of this line below..*/
            data_mono[i*step_mono+j*1+0]=data[i*step+j*channels+0];

            
        cvThreshold(mono_thres,mono_thres,70,               /*70 is the lower cut off*/
        150,                                                /*this is the higher cut off*/
        CV_THRESH_BINARY                                    /*The type of thresholding,more description in the documentation*/
                                              
        );

      //imshow( window_name, grad );

    cvShowImage("My Window",mono_thres);
    cvDestroyWindow( "My Window" );

      waitKey(0);

      return 0;
      }

    mardi 10 juillet 2012 09:45

Toutes les réponses

  • J'ai pas tout compris.

    Utilisez le débuggeur pour voir l'exécution en pas à pas.

    Vraisemblablement un plantage arrête votre programme.


    Paul Bacelar, Ex - MVP VC++

    mardi 10 juillet 2012 12:07
    Modérateur
  • Tout d'abord merci d'avoi répondu.

    Après plusieurs heures de recherche j'ai tt compte fait trouver mes erreurs en fait il s'agissait d'une waitkey mal placé et une qui était en  trop ainsi que quelques valeurs à modifier, ce n'etait pas un problème de format d'image.. Je vous renvoie le code corrigé si ca interesse :

    #include <stdlib.h>
    #include "StdAfx.h"

    using namespace cv;

    /*************************************** FONCTION SOBEL ************************************************/

    /********************************* Fonction principale sobel *******************************************/

    int main( )
    {

        int height,width,step,step_mono,channels;          /*Here i have declared step_mono for handling the widthstep member of a monochrome image*/

        uchar *data,*data_mono;                            /*similarly data mono for handling the data of monochrome image*/

        int i,j,k;
      //Mat src;
      Mat src_gray;
      Mat grad;
      char* window_name = "Sobel Demo - Simple Edge Detector";
      int scale = 1;
      int delta = 0;
      int ddepth = CV_16S;

      int c;

    /// Load an image
    IplImage* frame=cvLoadImage("D:/Entwicklung/OpenCV/2010/test threshold/Release/sobel.bmp",1);

    if( frame == NULL )
    { return -1; }

    Mat src(frame);


      GaussianBlur(src, src, Size(3,3), 0, 0, BORDER_DEFAULT );

      /// Convert it to gray
      cvtColor( src, src_gray, CV_RGB2GRAY );

      /// Create window
      namedWindow( window_name, CV_WINDOW_AUTOSIZE );

      /// Generate grad_x and grad_y
      Mat grad_x, grad_y;
      Mat abs_grad_x, abs_grad_y;

      /// Gradient X
      //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_x, abs_grad_x );

      /// Gradient Y
      //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_y, abs_grad_y );

      /// Total Gradient (approximate)
      addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

      imshow( window_name, grad );
      //waitKey(0);

      //Resultat de grad dans IPL ....
      //IplImage  mono_thres=cvCreateImage( cvGetSize(frame), 8, 1 );
     IplImage frame2(grad);     


        /*Mat imgMat(frame);  
        grad = frame;

        IplImage ipl_img = grad;
        CvMat cvmat = grad;*/



     //Faire à la fin
     IplImage* mono_thres=cvCreateImage( cvGetSize(&frame2), 8, 1 );


        height = frame2.height;                           /*height is a member of IPLIMAGE structure and hence it comes handy like this in such situations, and same goes with below four statements*/
        width = frame2.width;
        step = frame2.widthStep;
        step_mono = mono_thres->widthStep;
        channels = frame2.nChannels;                      /*Number of channels in the image*/

        data = (uchar *)frame2.imageData;                 /*Image is treated as as unsigned char data hence we use an unsigned char pointer to point to the same*/
        cvNamedWindow("My Window", CV_WINDOW_AUTOSIZE );
        data_mono = (uchar *)mono_thres-> imageData;       /*data of mono image is handled by the data_mono*/
     
        for(i=0;i < height;i++) for(j=0;j < width;j++)      /*I am copying the first channel from the image in "frame" in the monochrome image with the help of this line below..*/
            data_mono[i*step_mono+j*1+0]=data[i*step+j*channels+0];

            
        //cvThreshold(mono_thres,mono_thres,70,               /*70 is the lower cut off*/
        //150,                                                /*this is the higher cut off*/
        //CV_THRESH_BINARY                                    /*The type of thresholding,more description in the documentation*/
                                              
        //);

        cvThreshold(mono_thres,mono_thres,12,               /*70 is the lower cut off*/
        40,                                                /*this is the higher cut off*/
        CV_THRESH_BINARY                                    /*The type of thresholding,more description in the documentation*/
                                              
        );

      //imshow( window_name, grad );

    cvShowImage("My Window",mono_thres);

      waitKey(0);
      cvDestroyWindow( "My Window" );


      return 0;
      }

    mardi 10 juillet 2012 15:14