Ask Your Question
1

How to crop the rectangle part of the image?

asked 2017-04-09 23:20:02 -0600

tesh94 gravatar image

updated 2020-09-16 15:05:02 -0600

I have this image and I've used the code from the tutorial to find the 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( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback );
  thresh_callback( 0, 0 );

  waitKey(0);
  return(0);
}

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

  /// Detect edges using canny
  Canny( src_gray, canny_output, thresh, thresh*2, 3 );
  /// Find contours
  findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

  /// Draw contours
  Mat drawing = Mat::zeros( canny_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, i, color, 2, 8, hierarchy, 0, Point() );
     }

  /// Show in a window
  namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
  imshow( "Contours", drawing );
}

How do i then go on about to crop the rectangle part of the image?

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
2

answered 2017-04-10 06:02:50 -0600

Well saying I've used the code from the tutorial tells me you just copy pasted the code. Those samples are there for you to adapt it to your needs ... Questions like this never get decent support, because it tells us you did not try anything rather then copying the code.

You could follow these steps

  • Replace CV_RETR_TREE by CV_RETR_EXTERNAL to remove useless contours and only keep the interesting contours
  • Then calculate the area of your contours, using contourArea()
  • Now define a threshold for minimal and maximal area, to keep only your rectangle contour

Using that final contour you can cut that part of the image out, using the region of interest approach.

edit flag offensive delete link more

Comments

you should find the contour of rectangle first,and then crop it.

jsxyhelu gravatar imagejsxyhelu ( 2017-04-10 08:59:12 -0600 )edit
1

Ok thanks. I've managed to do it.

tesh94 gravatar imagetesh94 ( 2017-04-10 19:58:34 -0600 )edit

@jsxyhelu that is exactly what I am proposing ... the findContours gives you a list of contours, which you sort until one is left due to your criteria. Then we can use that to crop using a region of interest... I do not really get your remark... @tesh94 nice that you did it!

StevenPuttemans gravatar imageStevenPuttemans ( 2017-04-11 03:51:30 -0600 )edit

Question Tools

1 follower

Stats

Asked: 2017-04-09 23:20:02 -0600

Seen: 4,672 times

Last updated: Apr 10 '17