Declaration of function and use it
-
@gauravsharma0190 What are src_gray, dst, threshold_value, max_BINARY_value,threshold_type? Where are they defined and initialized? Please note: these are NOT same as in MainWindow::on_onTrackball_clicked()!
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("Threshold", dst );
@jsulm
Hey Good morning
These are defined in the same function .cpp files.
Yes These are not in mainwindow -
@jsulm
Hey Good morning
These are defined in the same function .cpp files.
Yes These are not in mainwindow@gauravsharma0190 Did you initialize these variables? Do they have correct values when you call threshold()?
-
@gauravsharma0190 Did you initialize these variables? Do they have correct values when you call threshold()?
@jsulm
Yes i initialize these with correct values. -
@jsulm
Yes i initialize these with correct values.@gauravsharma0190 Are you sure? Did you verify using debugger? If they have correct values then I don't know why it's crashing...
-
@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. -
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.
-
@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.@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.
-
@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 ); } ......
-
@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 ); } ......
@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 */
-
@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); } ...
-
@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); } ...
@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.
-
@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. -
@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.@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, ...) {
-
@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.