Declaration of function and use it


  • Qt Champions 2018

    @gauravsharma0190 Did you initialize these variables? Do they have correct values when you call threshold()?



  • @jsulm
    Yes i initialize these with correct values.


  • Qt Champions 2018

    @gauravsharma0190 Are you sure? Did you verify using debugger? If they have correct values then I don't know why it's crashing...



  • @gauravsharma0190 said:

    void MainWindow::on_onTrackball_clicked()
    {
    int threshold_value = 0;
    int threshold_type = 3;
    int const max_value = 255;
    int const max_type = 4;
    // int const max_BINARY_value = 255;

    Mat src, src_gray, dst;
    

    // char* window_name = "Threshold Demo";

    //char* trackbar_type = "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted";
    //char* trackbar_value = "Value";
    
    
    
    
    /// Load image
    src = imread( "/home/pi/Desktop/b4.jpg");
    
    
      /// Convert the image to Gray
      cvtColor( src, src_gray, CV_BGR2GRAY );
    
      /// Create a window to display results
      namedWindow( "Threshold", CV_WINDOW_AUTOSIZE );
    
      /// Create Trackbar to choose type of Threshold
      createTrackbar( "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted","Threshold", &threshold_type, max_type, Threshold_Demo );
    
      createTrackbar( "value","Threshold", &threshold_value, max_value, Threshold_Demo );
    
      /// Call the function to initialize
    

    @@@ Threshold_Demo( 0, 0)

    }

    When I Comment the line Threshold _demo everything went OK!!!
    Results are coming but when i uncomment it everything crashes.


  • Lifetime Qt Champion

    Hi
    I have a teory ;)

    namedWindow

    void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )

    It wants a ref, so i assume that the crash is that
    // char* window_name = "Threshold Demo";

    will run out of scope

    where as
    namedWindow( "Threshold", CV_WINDOW_AUTOSIZE );
    There "Threshold" is managed by the compiler and wont run out.

    To test this, please move
    char* window_name = "Threshold Demo";

    OUTSIDE the function so it last longer than function call.


  • Qt Champions 2018

    @gauravsharma0190 Please take a closer look at this code:

    void MainWindow::on_onTrackball_clicked()
    {
    int threshold_value = 0;
    int threshold_type = 3;
    int const max_value = 255;
    int const max_type = 4;
    // int const max_BINARY_value = 255;
    // These variables are LOCAL!
    Mat src, src_gray, dst;
    

    You use local variables in void MainWindow::on_onTrackball_clicked(). All these variables exist only in that function: Mat src, src_gray, dst;
    In Threshold_Demo() these variable are not visible (I have no idea why your code compiles? You probably defined these variables somewhere else again). I already pointed out this issue in one of my previous posts.

    void Threshold_Demo( int, void* )
    {
      /* 0: Binary
         1: Binary Inverted
         2: Threshold Truncated
         3: Threshold to Zero
         4: Threshold to Zero Inverted
       */
    // src_gray, dst, threshold_value, max_BINARY_value,threshold_type are GLOBAL! Where are they defined?
    @@threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
    

    Please make really sure src_gray, dst, threshold_value, max_BINARY_value,threshold_type have valid values when you call threshold( )! Use debugger for this.



  • @jsulm
    Hey the ontrack.cpp file has these variable defined i havn't sent you full code
    here it is

    #include"onTrack.h"
    #include<imgproc.hpp>
     using namespace cv;
    using namespace std;
    int threshold_value=0;
    int threshold_type=3;
    int const max_BINARY_value=255;
    Mat src_gray,dst;
    
    void Threshold_Demo( int, void* )
    {
      /* 0: Binary
         1: Binary Inverted
         2: Threshold Truncated
         3: Threshold to Zero
         4: Threshold to Zero Inverted
       */
    
      threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
    
      imshow( window_name, dst );
    }
    ......

  • Qt Champions 2018

    @gauravsharma0190 That is the problem I'm talking all the time! You do not initialize src_gray,dst from ontrack.cpp, so you use not properly initialized variables in Threshold_Demo(). As I said in MainWindow::on_onTrackball_clicked() you use local variables rc_gray,dst, not the ones from ontrack.cpp!
    So, again where are these variables initialized?

    // Where are they initialized?
    Mat src_gray,dst;
    
    void Threshold_Demo( int, void* )
    {
      /* 0: Binary
         1: Binary Inverted
         2: Threshold Truncated
         3: Threshold to Zero
         4: Threshold to Zero Inverted
       */
    


  • @jsulm said:

    That is the problem I'm talking all the time! You do not initialize src_gray,dst from ontrack.cpp, so you use not properly initialized variables in Threshold_Demo(). As I said in MainWindow::on_onTrackball_clicked() you use local variables rc_gray,dst, not the ones from ontrack.cpp!
    So, again where are these variables initialized?

    // Where are they initialized?
    Mat src_gray,dst;

    void Threshold_Demo( int, void* )
    {
    /* 0: Binary
    1: Binary Inverted
    2: Threshold Truncated
    3: Threshold to Zero
    4: Threshold to Zero Inverted
    */

    I initalized it in Mainwindow::onTrackBall_clicked().
    I am sending you.
    mainWindow.cpp*******

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include<opencv2/opencv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include<QFileDialog>
    #include<QMessageBox>
    #include <iostream>
    #include<QProcess>
    #include "onTrackBall.h"
    #include<syscall.h>
    #include<signal.h>
    #include <string>
    #include<stdlib.h>
    #include<sys/ioctl.h>
    #include <fstream>
    #include<time.h>
    #include<QTimer>
    #include<QDateTime>
    //#include"onTrackBall.h"
    //#include"onTrackBall.c"
    using namespace cv;
    using namespace std;
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QTimer *timer=new QTimer(this);
        connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
                timer->start();
                QDateTime dateTime=QDateTime::currentDateTime();
                QString datetimetext=dateTime.toString();
                ui->DateTime->setText(datetimetext);
    
    }
    void MainWindow::on_onTrackball_clicked()
    {
        int threshold_value = 0;
        int threshold_type = 3;
        int const max_value = 255;
        int const max_type = 4;
       // int const max_BINARY_value = 255;
    
        Mat src, src_gray;
    
    
    
    
    
        /// Load image
        src = imread( "/home/pi/Desktop/b4.jpg");
    
    
          /// Convert the image to Gray
          cvtColor( src, src_gray, CV_BGR2GRAY );
    
          /// Create a window to display results
          namedWindow( "Threshold", CV_WINDOW_NORMAL );
    
          /// Create Trackbar to choose type of Threshold
          createTrackbar( "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted","Threshold", &threshold_type, max_type, Threshold_Demo );
    
          createTrackbar( "value","Threshold", &threshold_value, max_value, Threshold_Demo );
    
          /// Call the function to initialize
        Threshold_Demo( 0, 0 );
    
    
        /// Separate the image in 3 places ( B, G and R )
        vector<Mat> bgr_planes;
        split( src, bgr_planes );
    
        /// Establish the number of bins
        int histSize = 256;
    
        /// Set the ranges ( for B,G,R) )
        float range[] = { 0, 256 } ;
        const float* histRange = { range };
    
        bool uniform = true;
        bool accumulate = false;
    
        Mat b_hist, g_hist, r_hist;
    
        /// Compute the histograms:
        calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate );
        calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate );
        calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
    
        // Draw the histograms for B, G and R
        int hist_w = 512; int hist_h = 400;
       int bin_w = cvRound( (double) hist_w/histSize );
    
        Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) );
    
        /// Normalize the result to [ 0, histImage.rows ]
        normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
        normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
        normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
    
        /// Draw for each channel
        for( int i = 1; i < histSize; i++ )
        {
            line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1)) ) ,
                             Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),
                             Scalar( 255, 0, 0), 2, 8, 0  );
            line( histImage, Point( bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1)) ) ,
                             Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),
                             Scalar( 0, 255, 0), 2, 8, 0  );
            line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ) ,
                             Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
                             Scalar( 0, 0, 255), 2, 8, 0  );
        }
    
        /// Display
        namedWindow("calcHist Demo", CV_WINDOW_NORMAL );
        imshow("calcHist Demo", histImage );
      imwrite("calcHist Demo2.jpg", histImage);
    waitKey(-1);
    
    
      }
    ...

  • Qt Champions 2018

    @gauravsharma0190 Please read what I'm writing more carefully!
    In Mainwindow::onTrackBall_clicked() you don't initialize them! Because you use local variables there with same names:

    void MainWindow::on_onTrackball_clicked()
    {
         // Here src and src_gray are not the same as in ontrack.cpp!
         // Values you're assigning here to src and src_gray are only visible here but not in ontrack.cpp!
        Mat src, src_gray;
    

    I'm running out of ideas how to explain it. You should learn C++, especially the visibility and scope of variables.



  • @jsulm
    You mean to say in OnTrack_clicked()
    src and src_gray variable
    and in ontrack.cpp
    src_gray variable should be different.
    I can't get you.
    In Mainwindow::onTrackBall_clicked() you don't initialize them! Because you use local variables there with same names:

    void MainWindow::on_onTrackball_clicked()
    {
    // Here src and src_gray are not the same as in ontrack.cpp!
    // Values you're assigning here to src and src_gray are only visible here but not in ontrack.cpp!
    Here what is local variable in it.
    Local mean variable inside the function??
    And globle mean en tire the programme.


  • Qt Champions 2018

    @gauravsharma0190 No, I don't mean that they should be different. I mean the opposite: they need to be the same (but they are not).
    Local variable is a variable which is only visible in a certain scope, for example in a function. The variables in ontrack.cpp are only visible in ontrack.cpp, but not in MainWindow. In Mainwindow::onTrackBall_clicked() you declare OTHER variables with SAME names.
    What do you think which src_grey is used in Threshold_Demo( int, void* )? Is it the one from MainWindow::onTrackBall_clicked() or the one from ontrack.cpp?

    // src_gray here is not the same as in MainWindow::onTrackBall_clicked()
    Mat src_gray,dst;
    void Threshold_Demo( int, void* )
    {
      threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
    }
    

    Actually you should pass the data to Threshold_Demo() as parameter:

    Mainwindow::onTrackBall_clicked()
    {
        Mat src, src_gray;
        ...
        Threshold_Demo(src_grey, /*what else needs to be passed from MainWindow to this function*/);
        ...
    }
    
    void Threshold_Demo(Mat &src_grey, ...)
    {
    


  • @jsulm
    OK it means src_gray value in .cpp file should be same as in mainwindow::on_Track clicked() src_gray value.
    Actually src_gray is image array.
    I did it by Define the value of src_grey in function as
    src=imread("/file.jpg);
    cvtColor( src, src_gray, CV_BGR2GRAY );
    so i will get src_gray value.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.