Ask Your Question
-1

I have the codes for live video and finding contours separately.I would like to know how both the codes can be stitched together to find contours in a live video

asked 2017-03-15 12:57:31 -0600

Ashiq KS gravatar image

updated 2017-03-15 13:13:33 -0600

CODE FOR LIVE VIDEO

#include<opencv2/opencv.hpp>
#include<iostream>


using namespace cv;

using namespace std;

int main()
    {
    Mat CameraFrame;
    Mat Grey;

    VideoCapture cap;
    char keypressed;

    //Opens the first imaging device.
    cap.open(0);

    //Check whether user selected camera is opened successfully.
    if( !cap.isOpened() )
    {
    cout << "***Could not initialize capturing...***\n";
   return -1;
   }

   //Create a windows to display camera preview.
   namedWindow("Camera Preview", CV_WINDOW_AUTOSIZE);

   //Loop infinitely to fetch frame from camera and display it.
   for(;;)
   {
   //Fetch frame from camera.
   cap >> CameraFrame;

   //Check whether received frame has valid pointer.
   if( CameraFrame.empty() )
   break;

   //Display the received frame
   imshow("Camera Preview", CameraFrame);

   //Wait for Escape keyevent to exit from loop
   keypressed = (char)waitKey(10);
   if( keypressed == 27 )
   break;
   }

   //Release the camera interface.
   cap.release();

   return 0;
   }

CODE FOR FINDING CONTOURS

  #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>

    using namespace cv;
    using namespace std;

    Mat src; Mat src_gray;
    int thresh = 100;
    int max_thresh = 255;
    RNG rng(12345);

    /// Function header
    void thresh_callback(int, void* );

    /** @function main */
    int main( int argc, char** argv )
    {
      /// Load source image and convert it to gray
      src = imread( argv[1], 1 );

      /// Convert image to gray and blur it
      cvtColor( src, src_gray, CV_BGR2GRAY );
      blur( src_gray, src_gray, Size(3,3) );

      /// Create Window
      char* source_window = "Source";
      namedWindow( source_window, CV_WINDOW_AUTOSIZE );
      imshow( source_window, src );

      createTrackbar( " Threshold:", "Source", &thresh, max_thresh, thresh_callback );
      thresh_callback( 0, 0 );

      waitKey(0);
      return(0);
    }

    /** @function thresh_callback */
    void thresh_callback(int, void* )
    {
      Mat threshold_output;
      vector<vector<Point> > contours;
      vector<Vec4i> hierarchy;

      /// Detect edges using Threshold
      threshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY );
      /// Find contours
      findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

      /// Approximate contours to polygons + get bounding rects and circles
      vector<vector<Point> > contours_poly( contours.size() );
      vector<Rect> boundRect( contours.size() );
      vector<Point2f>center( contours.size() );
      vector<float>radius( contours.size() );

      for( int i = 0; i < contours.size(); i++ )
         { approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
           boundRect[i] = boundingRect( Mat(contours_poly[i]) );
           minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] );
         }


      /// Draw polygonal contour + bonding rects + circles
      Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
      for( int i = 0; i< contours.size(); i++ )
         {
           Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
           drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
           rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
           circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );
         }

      /// Show in a window
      namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
      imshow( "Contours", drawing );
    }
edit retag flag offensive close merge delete

2 answers

Sort by ยป oldest newest most voted
3

answered 2017-03-17 05:18:08 -0600

updated 2017-07-05 07:13:03 -0600

Instead of finding it on a single image, you have to find the contours on all the frames on the video. What you've done in main() in the second program has to be done in a loop. This will be the main function:

int main()
{
    VideoCapture cap(*path to your video file or 0/1 for webcam video*);

    for(;;)
    {
        /// Load source image and convert it to gray
        cap >> src;

        /// Convert image to gray and blur it
        cvtColor(src, src_gray, CV_BGR2GRAY);
        blur(src_gray, src_gray, Size(3, 3));

        /// Create Window
        char* source_window = "Source";
        namedWindow(source_window, CV_WINDOW_AUTOSIZE);
        imshow(source_window, src);

        createTrackbar(" Threshold:", "Source", &thresh, max_thresh, thresh_callback);
        thresh_callback(0, 0);

        if (waitKey(27) >= 0)
            break;
    }
    return(0);
}
edit flag offensive delete link more

Comments

2

Sorry i posted in answer box instead of comment

Wael gravatar imageWael ( 2017-03-17 15:30:12 -0600 )edit

@Wael Ok but now it is not the good question...

LBerger gravatar imageLBerger ( 2017-03-17 15:47:12 -0600 )edit
1

answered 2019-11-21 08:40:45 -0600

Gilal Nauman gravatar image

You can find the contours after your final result and your final operation is blur() after blur operation you can do code for contours. 1. Read the Video Streams 2. Gray Scale Conversion 3. Threshold 4. Apply Morphological Operation to remove the noise 5. Blur operation 6. Find contours 7. Bound Rectangles where you find the contours. I hope this will helpful your revise your code according to mention steps.

edit flag offensive delete link more

Question Tools

1 follower

Stats

Asked: 2017-03-15 12:57:31 -0600

Seen: 1,523 times

Last updated: Nov 21 '19