Declaration of function and use it


  • Qt Champions 2018

    Sorry, but the code you posted is invalid C/C++! First of all: why do you have 2 main functions?
    Why did you put other functions inside void MainWindow::onTrackball_clicked(int,void*)? This is not going to compile and I'm not going to fix it for you. How familiar are you actually with C/C++?
    What you have to do is: do not put the C function definitions inside void MainWindow::onTrackball_clicked(int,void*), instead put them inside another source code file and header, include the header file in MainWindow and then call the functions in void MainWindow::onTrackball_clicked(int,void*). As an alternative you can have those C functions in MainWindow.cpp but not inside void MainWindow::onTrackball_clicked(int,void*) !



  • @jsulm
    i don't put these function definition inside voidmainwindow::ontrackball
    but i am asking you how can i call that function inside my void mainwindow::ontrackball

    void CannyThreshold(int, void)
    {
    /// Reduce noise with a kernel 3x3
    blur( src_gray, detected_edges, Size(3,3) );
    /// Canny detector
    Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
    
    /// Using Canny's output as a mask, we display our result
    dst = Scalar::all(0);
    
    src.copyTo( dst, detected_edges);
    imshow( window_name, dst );
    }
    

    Mean i hyave done .cpp and .h file of this and include in my code both.


  • Qt Champions 2018

    @gauravsharma0190 Like this?

    CannyThreshold(1, nullptr);
    

    So, what exactly is the problem?
    In the code you posted you DID put these function definitions inside void MainWindow::onTrackball_clicked(int,void*) (just check what you posted).


  • Qt Champions 2018

    @gauravsharma0190 Shouldn't

    void CannyThreshold(int, void)
    

    be

    void CannyThreshold(int, void*)
    

    ?



  • ok now i will send you refresh code just wait.
    Thank you.
    i will send you refresh code and errors.



  • @jsulm
    hey here is the code i have done with that.
    /////main.cpp////

    #include<opencv2/highgui/highgui.hpp>
    #include<opencv2/core/core.hpp>
    #include<opencv2/opencv.hpp>
    using namespace cv;
    using namespace std;
    int main(int argc, char *argv[])
    {
    
        QApplication a(argc, argv);
        QSplashScreen *splash =new QSplashScreen;
        splash->setPixmap(QPixmap("/home/pi/Desktop/ceeri1.jpg"));
        splash->show();
    
        MainWindow w;
        QTimer::singleShot(3500,splash,SLOT(close()));
    
        QTimer::singleShot(3500,&w,SLOT(show()));
    
      //w.show();
    
        return a.exec();
    }
    

    ///mainwindow.h///

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    //using namespace cv;
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
    Q_OBJECT
    
    public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
    private slots:
    void showTime();
    
    void on_pushButton_5_clicked();
    void onTrackball_clicked(int,void*);
    
    private:
    Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    

    ///ontrack.h///

    #ifndef __ONTRACK_h
    #define __ONTRACK_h
    void cannyThresold(int,void*);
    #endif
    

    ///ontrack.cpp

    #include "ontrack.h"
    #include<opencv2/opencv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/core/core.hpp>
    void CannyThreshold(int, void)
    {
    /// Reduce noise with a kernel 3x3
    blur( src_gray, detected_edges, Size(3,3) );
    /// Canny detector
    Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
    
    /// Using Canny's output as a mask, we display our result
    dst = Scalar::all(0);
    
    src.copyTo( dst, detected_edges);
    imshow( window_name, dst );
    }
    

    //Here Comes Mainwindow.cpp///

    #include "ui_mainwindow.h"
    #include<opencv2/opencv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/core/core.hpp>
    #include "ontrack.h"
    #include<QFileDialog>
    #include<QMessageBox>
    #include <iostream>
    #include <string>
    #include <fstream>
    #include<time.h>
    #include<QTimer>
    #include<QDateTime>
    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);
    
    }
    ////////Time///////////////
    void MainWindow:: showTime()
    {
    QTime time=QTime::currentTime();
    QString time_text=time.toString("hh : mm : ss");
    if((time.second() % 2)==0)
    {
    time_text[3] =' ';
    time_text[8] =' ';
    }
    ui->Digital->setText(time_text);
    
    }
    
    MainWindow::~MainWindow()
    {
    delete ui;
    }
    
    void MainWindow::on_pushButton_4_clicked()
    {
    
    }
    
    void MainWindow::on_pushButton_5_clicked()
    {
    QString filename=QFileDialog::getOpenFileName(
    this,
    tr("Open file") ,
    "/home/pi/Desktop",
    tr("All files(*.png *.jpg)"));
    
    QMessageBox::information(this,tr("Filename"),filename);
    if(QString::compare(filename,QString())!=0)
    {
        QImage image;
        bool valid=image.load(filename);
        if(valid)
        {
            image=image.scaledToWidth(ui->Picture->width(),Qt::SmoothTransformation);
            ui->Picture->setPixmap(QPixmap::fromImage(image));
    
        }
    void MainWindow::onTrackball_clicked(int,void*)
    {
    
    
    Mat src, src_gray;
    Mat dst, detected_edges;
    
    int edgeThresh = 1;
    int lowThreshold;
    int const max_lowThreshold = 100;
    int ratio = 3;
    int kernel_size = 3;
    char* window_name = "Edge Map";
    
    
    
    @function CannyThreshold
    @brief Trackbar callback - Canny thresholds input with a ratio 1:3
    /
    
    
    /// Load an image
    src = imread( argv[1] );
    
    if( !src.data )
    { return -1; }
    
    /// Create a matrix of the same type and size as src (for dst)
    dst.create( src.size(), src.type() );
    
    /// Convert the image to grayscale
    cvtColor( src, src_gray, CV_BGR2GRAY );
    
    /// Create a window
    namedWindow( window_name, CV_WINDOW_AUTOSIZE );
    
    /// Create a Trackbar for user to enter threshold
    createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );
    
    /// Show the image
    CannyThreshold(0, 0);
    
    }
    }
    ...
    But error occurs defination of function outside the class.


  • @gauravsharma0190 said:

    Sorry in ontrack.cpp i again add
    Mat src, src_gray;
    Mat dst, detected_edges;


  • Qt Champions 2018

    @gauravsharma0190 Can you post the whole error message?
    Why do you have int and void* parameter in onTrackball_clicked which you do not use?


  • Qt Champions 2018

    @gauravsharma0190 Take a look at this:

    
    void MainWindow::on_pushButton_5_clicked()
    {
    QString filename=QFileDialog::getOpenFileName(
    this,
    tr("Open file") ,
    "/home/pi/Desktop",
    tr("All files(*.png *.jpg)"));
    
    QMessageBox::information(this,tr("Filename"),filename);
    if(QString::compare(filename,QString())!=0)
    {
        QImage image;
        bool valid=image.load(filename);
        if(valid)
        {
            image=image.scaledToWidth(ui->Picture->width(),Qt::SmoothTransformation);
            ui->Picture->setPixmap(QPixmap::fromImage(image));
    
        }
    void MainWindow::onTrackball_clicked(int,void*)
    {
    

    void MainWindow::onTrackball_clicked(int,void*) is inside void MainWindow::on_pushButton_5_clicked() - this is invalid!



  • @jsulm
    but i am not defining ontrack_clicked in push button its different.


  • Lifetime Qt Champion

    @gauravsharma0190

    Are you sure ?
    it really, really looks like you do :)



  • @mrjj
    sir i again improving it.
    as

    void MainWindow::on_pushButton_6_clicked()
    {
       /* Mat src , dst;
    
    
     //   char* source_window = "Source image";
       // char* equalized_window = "Equalized Image";
    
        /// Load image
        src = imread( "/home/pi/Desktop/b4.jpg" );
    
    
    
        /// Convert to grayscale
        cvtColor( src, src, CV_BGR2GRAY );
    
        /// Apply Histogram Equalization
        equalizeHist( src, dst );
    
        /// Display results
        namedWindow( "source", CV_WINDOW_NORMAL );
        namedWindow( "equalized", CV_WINDOW_NORMAL );
    
        imshow( "source", src );
        imshow( "equalized", dst );
    
        /// Wait until user exits the program
      //  waitKey(0);*/
    
    
    
        Mat src_base, hsv_base;
        Mat src_test1, hsv_test1;
        Mat src_test2, hsv_test2;
        Mat hsv_half_down;
    
        /// Load three images with different environment settings
    
        src_base = imread( "/home/pi/Desktop/b4.jpg" );
        src_test1 = imread( "/home/pi/Desktop/b4.jpg" );
        src_test2 = imread( "/home/pi/Desktop/b3.jpg" );
    
        /// Convert to HSV
        cvtColor( src_base, hsv_base, COLOR_BGR2HSV );
        cvtColor( src_test1, hsv_test1, COLOR_BGR2HSV );
        cvtColor( src_test2, hsv_test2, COLOR_BGR2HSV );
    
        hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );
    
        /// Using 50 bins for hue and 60 for saturation
        int h_bins = 50; int s_bins = 60;
        int histSize[] = { h_bins, s_bins };
    
        // hue varies from 0 to 179, saturation from 0 to 255
        float h_ranges[] = { 0, 180 };
        float s_ranges[] = { 0, 256 };
    
        const float* ranges[] = { h_ranges, s_ranges };
    
        // Use the o-th and 1-st channels
        int channels[] = { 0, 1 };
    
    
        /// Histograms
        MatND hist_base;
        MatND hist_half_down;
        MatND hist_test1;
        MatND hist_test2;
    
        /// Calculate the histograms for the HSV images
        calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false );
        normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );
    
        calcHist( &hsv_half_down, 1, channels, Mat(), hist_half_down, 2, histSize, ranges, true, false );
        normalize( hist_half_down, hist_half_down, 0, 1, NORM_MINMAX, -1, Mat() );
    
        calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false );
        normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );
    
        calcHist( &hsv_test2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false );
        normalize( hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat() );
    
        /// Apply the histogram comparison methods
        for( int i = 0; i < 4; i++ )
        {
            int compare_method = i;
            double base_base = compareHist( hist_base, hist_base, compare_method );
            double base_half = compareHist( hist_base, hist_half_down, compare_method );
            double base_test1 = compareHist( hist_base, hist_test1, compare_method );
            double base_test2 = compareHist( hist_base, hist_test2, compare_method );
    
            printf( " Method [%d] Perfect, Base-Half, Base-Test(1), Base-Test(2) : %f, %f, %f, %f \n", i, base_base, base_half , base_test1, base_test2 );
        }
    
    
    
    
        }
    
    
    
    void MainWindow::on_onTrackball_clicked()
    {
    
        Mat src, src_gray;
        Mat dst, detected_edges;
    
        int edgeThresh = 1;
        int lowThreshold;
        int const max_lowThreshold = 100;
        int ratio = 3;
        int kernel_size = 3;
        char* window_name = "Edge Map";
    
    
    
        /// Load image
        src = imread( "/home/pi/Desktop/b4.jpg");
         /// Create a matrix of the same type and size as src (for dst)
    
    
    
        dst.create( src.size(), src.type() );
    
        /// Convert the image to grayscale
        cvtColor( src, src_gray, CV_BGR2GRAY );
    
        /// Create a window
        namedWindow( window_name, CV_WINDOW_NORMAL );
    
        /// Create a Trackbar for user to enter threshold
      //  createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );
    
        /// Show the image
        CannyThreshold(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_AUTOSIZE );
        imshow("calcHist Demo", histImage );
      imwrite("calcHist Demo2.jpg", histImage);
        waitKey(-1);
    
    
      }
    
    
    ...
    This is new improved code .but there are error or build issue
    1.In member function'void mainwindow::on_on_trackball_clicked()
    ****canny Thresol was not declered in this scope .(function which i declare and define in .h and .c file.
    unsed variable 'edgeThresh'.

  • Lifetime Qt Champion

    @gauravsharma0190 said:

    CannyThreshold

    this function ?
    CannyThreshold
    that you call with
    CannyThreshold(0, 0);

    and you do include the .h file where its defined?



  • @mrjj
    it is defined as

    ///ontrack.h///
    
    #ifndef __ONTRACK_h
    #define __ONTRACK_h
    void cannyThresold(int,void*);
    #endif
    ......
    
    ///ontrack.cpp
    #include "ontrack.h"
    #include<opencv2/opencv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/core/core.hpp>
    void CannyThreshold(int, void*)
    {
    /// Reduce noise with a kernel 3x3
    blur( src_gray, detected_edges, Size(3,3) );
    /// Canny detector
    Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
    
    /// Using Canny's output as a mask, we display our result
    dst = Scalar::all(0);
    
    src.copyTo( dst, detected_edges);
    imshow( window_name, dst );
    }
    

    .....
    thus i include ontrack.h in mainwindow.cpp code.
    but error occurs.
    Why??
    i can't understand.


  • Lifetime Qt Champion

    I dont understand either.
    Seems fine.
    try to define a test function
    as in
    ontrack.h
    void mytest();
    and call that from main.

    If that is still not known, it means that mainwinow do not really include ontrack.h for some reason.


  • Qt Champions 2018

    @gauravsharma0190 You call it like this CannyThreshold(0, 0); and in ontrack.cpp it is defined like void CannyThreshold(int, void*). But in ontrack.h it is void cannyThresold(int,void*); please fix the name of the function.


  • Lifetime Qt Champion

    @jsulm
    heh Good spotted. completely missed "old" :)



  • @mrjj
    I fix canny as Canny in .h file
    but again error occurs.



  • @jsulm
    Hey i fixed it .But again error.


  • Qt Champions 2018

    @gauravsharma0190 "But again error" - why don't you say what error you get now?



  • @jsulm
    yes it tells undefined reference to 'CannyThresold(int,void*)'.
    collect2:error ld returned 1 exit status.


  • Qt Champions 2018

    @gauravsharma0190 Is ontrack.cpp part of your project and is it built?
    "undefined reference to 'CannyThresold(int,void*)" - means linker cannot find CannyThresold(int,void*)



  • @jsulm
    Actually i put .h and .cpp file in my qt project folder.


  • Qt Champions 2018

    @gauravsharma0190 But did you add them to your project?
    They should be in the PRO file, like:

    SOURCES += main.cpp\
            mainwindow.cpp\
            ontrack.cpp
    
    HEADERS  += mainwindow.h\
            ontrack.h
    


  • @jsulm
    i added it but gives error as
    parse error onTrack.cpp
    Makefile error 3


  • Qt Champions 2018

    @gauravsharma0190 After changing PRO file you need to rerun qmake (right-click on the project in QtCreator and then "Run qmake". Then do a rebuild.



  • @jsulm
    I done it
    Now gives many error regarding onTrack.cpp file.


  • Qt Champions 2018

    @gauravsharma0190 Well, I guess you have many issues there...



  • @jsulm
    Yeap.
    are they function's issuses or anything.
    I can't undersatnd everything is all right so Why all these issuses are there.
    I will send you these issue.



  • @gauravsharma0190
    Here are all the errors
    ...

    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:9: error: 'blur' was not declared in this scope
         blur(gray, edge, Size(3,3));
                                   ^
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:6: error: 'Mat' does not name a type
     Mat image, gray, edge, cedge;
     ^
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:7: error: 'void CannyThreshold(int, void*)' was declared 'extern' and later 'static' [-fpermissive]
       static void CannyThreshold(int, void*)
                                            ^
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:-1: In function 'void CannyThreshold(int, void*)':
    
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:9: error: 'edge' was not declared in this scope
         blur(gray, edge, Size(3,3));
                    ^
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:9: error: 'edge' was not declared in this scope
         blur(gray, edge, Size(3,3));
                    ^
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:9: error: 'blur' was not declared in this scope
         blur(gray, edge, Size(3,3));
                                   ^
    
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:12: error: 'Canny' was not declared in this scope
         Canny(edge, edge, edgeThresh, edgeThresh*3, 3);
                                                      ^
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:13: error: 'cedge' was not declared in this scope
         cedge = Scalar::all(0);
         ^
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:15: error: 'src' was not declared in this scope
         src.copyTo(cedge, edge);
         ^
    /home/pi/Desktop/qt/Desktop1/onTrackBall.cpp:16: error: 'imshow' was not declared in this scope
         imshow("Edge map", cedge);
                                 ^
    /usr/local/include/opencv2/highgui/highgui.hpp:78: note:   'cv::imshow'
     CV_EXPORTS_W void imshow(const string& winname, InputArray mat);
    


  • This post is deleted!


  • @jsulm
    Hey i have posted the error
    i can't undersatnd why i am getting these error.
    everything is all right.


  • Qt Champions 2018

    @gauravsharma0190 Nothing is all right with this code.
    "was not declared in this scope" - you have to check where are those declared or why they are not declared (blur, edge, Mat,...). For example:

    cedge = Scalar::all(0);
    

    where is cedge declared? You're trying to access a variable which was not declared.

    This one says that you first declared the function extern and later static. Why? Since it is just a function it neither has to be static nor extern!

    error: 'void CannyThreshold(int, void*)' was declared 'extern' and later 'static' [-fpermissive]
       static void CannyThreshold(int, void*)
    

    You really have to fix your code! And I really don't understand why you think your code is OK although there are really basic issues (not related to Qt at all)!



  • @jsulm
    i declare all these variable inside onTrach.cpp file.
    blur is function name which is in imgproc.hpp header.
    Canny is also function name which is declared in highgui.h header.


  • Qt Champions 2018

    @gauravsharma0190
    Can you post onTrach.cpp and onTrach.h?



  • @jsulm

    #include"onTrack.h"
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/core/core.hpp>
    #include<opencv2/imgproc/imgproc.hpp>
    int edgeThresh = 1;
    //Mat image,gray,edge,cedge; 
    
      void CannyThreshold(int, void*)
    {
    Mat image, gray, edge, cedge;
        blur(gray, edge, Size(3,3));
    
        // Run the edge detector on grayscale
        Canny(edge, edge, edgeThresh, edgeThresh*3, 3);
        cedge = Scalar::all(0);
    
        src.copyTo(cedge, edge);
        imshow("Edge map", cedge);
    }
    
    

    .H file

    #define ONTRACKBALL_H_
      int CannyThreshold(int,void* );
    #endif
    //your code here
    

    Mat is opencv function which is declare in highgui.h
    header.
    all these functions are present in header which i added in code.


  • Qt Champions 2018

    @gauravsharma0190 What is Mat and where is it declared?


  • Qt Champions 2018

    @gauravsharma0190 Didn't you forget

    using namespace cv;
    

    in the cpp file?



  • @jsulm
    Mat is basically a class with two data parts: the matrix header (containing information such as the size of the matrix, the method used for storing, at which address is the matrix stored, and so on) and a pointer to the matrix containing the pixel values (taking any dimensionality depending on the method chosen for storing) . The matrix header size is constant, however the size of the matrix itself may vary from image to image and usually is larger by orders of magnitude



  • @gauravsharma0190
    Hey jslum
    thanks very mush i did it without error
    Now new problem arises when i clicked the push button it tells
    The program has unexpectedly finished.
    /home/pi/Desktop/qt /build-Desktop1-GCC Local/Desktop crashed.


Log in to reply