Ask Your Question

How to call a function in a main function With OpenCv and C++?

asked 2017-09-13 04:10:51 -0500

louis89 gravatar image

Hi.I use below code for video capture from my webcam:

Mat frame;
int threshval =120;
static void on_trackbar(int, void*)

 int main(int argc, char* argv[])

     VideoCapture cap(0);
     if (!cap.isOpened())
         cout << "Cannot open the video cam" << endl;
         return  0;


     while (1)
         bool bSuccess =; // Khandane yek frame jadid dar video

         if (!bSuccess)
             cout << "Cannot read a frame from video stream" << endl;
    createTrackbar("Threshold", "Image", &threshval, 255, on_trackbar);
    on_trackbar(threshval, 0);}
             return 0; }

I want to use a function that takes the image from video capture class and convert that frame to a gray level image and use Canny Edge Detector for that image.for this reason I use this function:

int my_cannyEdgeDetector(){

         cvtColor(frame, frame2, COLOR_BGR2GRAY);
         Canny(frame2, frame2, threshval, threshval * 2, 3);}

I know I wrote the wrong function but I'm begginer in opencv and c++ and I want to get pictures from the main function and put it in the my_cannyEdgeDetector function and imshow frame and frame2 in the end of my main function.I have no idea to set input and output for my_cannyEdgeDetector function.Thank you very much if you help me do this

edit retag flag offensive close merge delete


one example could be:

static void my_cannyEdgeDetector(const cv::Mat& frame, cv::Mat& frame2);

function call:

cv::Mat frame2;
my_cannyEdgeDetector(frame, frame2)
VxW gravatar imageVxW ( 2017-09-13 04:43:08 -0500 )edit

@Volkmar .thanks for your reply.but where should I add your code to my program?another question is that Is not it necessary to use a loop for read frame in my_cannyEdgeDetector function?and is not it necessary to set threshval as an input in my_cannyEdgeDetector?

louis89 gravatar imagelouis89 ( 2017-09-13 05:08:04 -0500 )edit

For information: cv::Canny can handle 3 channel images. Edge detection should be more stable than converting the image to grayscale before. But processing could be slower in this case.

matman gravatar imagematman ( 2017-09-13 11:20:44 -0500 )edit

1 answer

Sort by ยป oldest newest most voted

answered 2017-09-13 05:39:03 -0500

VxW gravatar image

try this:

#include "stdafx.h"
#include <opencv2/opencv.hpp>

static void my_cannyEdgeDetector(const cv::Mat& frame, cv::Mat& frame2, int threshval)
    cvtColor(frame, frame2, cv::COLOR_BGR2GRAY);
    Canny(frame2, frame2, threshval, threshval * 2, 3);


int main(int argc, char* argv[])
    cv::VideoCapture cap;
    std::string path = "video.avi";;

    if (!cap.isOpened())
        std::cout << "Could not open reference "  << std::endl;
        return -1;
        cv::Mat frame, frame2;

        for (;;)
            cap >> frame;

            my_cannyEdgeDetector(frame, frame2, 128);

            cv::imshow("test", frame2);

            if((cv::waitKey(2) & 0xEFFFFF) == 27)//esc
    return 0;
edit flag offensive delete link more
Login/Signup to Answer

Question Tools

1 follower


Asked: 2017-09-13 04:10:51 -0500

Seen: 850 times

Last updated: Sep 13 '17