Fitellipse opencv python example

In this tutorial you will learn how to:

Theory

Code

This tutorial code's is shown lines below. You can also download it from here

using namespace cv; using namespace std; int thresh = 100; void thresh_callback( int , void * ); int main( int argc, char ** argv ) CommandLineParser parser( argc, argv, "" ); Mat src = imread( samples::findFile( parser.get( "@input" ) ) ); cout << "Could not open or find the image!\n" << endl; cvtColor( src, src_gray, COLOR_BGR2GRAY ); blur( src_gray, src_gray, Size(3,3) ); const char * source_window = "Source" ; namedWindow( source_window ); imshow( source_window, src ); const int max_thresh = 255; createTrackbar( "Canny thresh:" , source_window, &thresh, max_thresh, thresh_callback ); thresh_callback( 0, 0 ); void thresh_callback( int , void * ) Mat canny_output; Canny( src_gray, canny_output, thresh, thresh*2 ); vector contours;minRect( contours.size() ); vector minEllipse( contours.size() ); for ( size_t i = 0; i < contours.size(); i++ ) minRect[i] = minAreaRect( contours[i] ); if ( contours[i].size() > 5 ) minEllipse[i] = fitEllipse( contours[i] ); Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 ); for ( size_t i = 0; i< contours.size(); i++ ) Scalar color = Scalar( rng.uniform(0, 256), rng.uniform(0,256), rng.uniform(0,256) ); drawContours( drawing, contours, ( int )i, color ); ellipse( drawing, minEllipse[i], color, 2 ); // rotated rectangle Point2f rect_points[4]; minRect[i].points( rect_points ); for ( int j = 0; j < 4; j++ ) line( drawing, rect_points[j], rect_points[(j+1)%4], color ); imshow( "Contours" , drawing );

This tutorial code's is shown lines below. You can also download it from here

import java.awt.BorderLayout; import java.awt.Container; import java.awt.Image; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.MatOfPoint2f; import org.opencv.core.Point; import org.opencv.core.RotatedRect; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.highgui.HighGui; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; class GeneralContours2 < private Mat srcGray = new Mat(); private JFrame frame; private JLabel imgSrcLabel; private JLabel imgContoursLabel; private static final int MAX_THRESHOLD = 255; private int threshold = 100; private Random rng = new Random(12345); public GeneralContours2(String[] args) < String filename = args.length > 0 ? args[0] : "../data/stuff.jpg" ; Mat src = Imgcodecs.imread(filename); if (src.empty()) < System.err.println( "Cannot read image: " + filename); System.exit(0); Imgproc.cvtColor(src, srcGray, Imgproc.COLOR_BGR2GRAY); Imgproc.blur(srcGray, srcGray, new Size(3, 3)); // Create and set up the window. frame = new JFrame( "Creating Bounding rotated boxes and ellipses for contours demo" ); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Set up the content pane. Image img = HighGui.toBufferedImage(src); addComponentsToPane(frame.getContentPane(), img); // Use the content pane's default BorderLayout. No need for // setLayout(new BorderLayout()); // Display the window. frame.setVisible( true ); private void addComponentsToPane(Container pane, Image img) < if (!(pane.getLayout() instanceof BorderLayout)) < pane.add( new JLabel( "Container doesn't use BorderLayout!" )); JPanel sliderPanel = new JPanel(); sliderPanel.setLayout( new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS)); sliderPanel.add( new JLabel( "Canny threshold: " )); JSlider slider = new JSlider(0, MAX_THRESHOLD, threshold); slider.setMajorTickSpacing(20); slider.setMinorTickSpacing(10); slider.setPaintTicks( true ); slider.setPaintLabels( true ); slider.addChangeListener( new ChangeListener() < public void stateChanged(ChangeEvent e) < JSlider source = (JSlider) e.getSource(); threshold = source.getValue(); sliderPanel.add(slider); pane.add(sliderPanel, BorderLayout.PAGE_START); JPanel imgPanel = new JPanel(); imgSrcLabel = new JLabel( new ImageIcon(img)); imgPanel.add(imgSrcLabel); Mat blackImg = Mat.zeros(srcGray.size(), CvType.CV_8U); imgContoursLabel = new JLabel( new ImageIcon(HighGui.toBufferedImage(blackImg))); imgPanel.add(imgContoursLabel); pane.add(imgPanel, BorderLayout.CENTER); private void update() < Mat cannyOutput = new Mat(); Imgproc.Canny(srcGray, cannyOutput, threshold, threshold * 2); List contours = new ArrayList<>(); Mat hierarchy = new Mat();

Imgproc.findContours(cannyOutput, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);

RotatedRect[] minRect = new RotatedRect[contours.size()]; RotatedRect[] minEllipse = new RotatedRect[contours.size()]; for ( int i = 0; i < contours.size(); i++) < minRect[i] = Imgproc.minAreaRect( new MatOfPoint2f(contours.get(i).toArray())); minEllipse[i] = new RotatedRect(); if (contours.get(i).rows() > 5) < minEllipse[i] = Imgproc.fitEllipse( new MatOfPoint2f(contours.get(i).toArray())); Mat drawing = Mat.zeros(cannyOutput.size(), CvType.CV_8UC3); for ( int i = 0; i < contours.size(); i++) < Scalar color = new Scalar(rng.nextInt(256), rng.nextInt(256), rng.nextInt(256)); Imgproc.drawContours(drawing, contours, i, color); Imgproc.ellipse(drawing, minEllipse[i], color, 2); // rotated rectangle Point[] rectPoints = new Point[4]; minRect[i].points(rectPoints); for ( int j = 0; j < 4; j++) < Imgproc.line(drawing, rectPoints[j], rectPoints[(j+1) % 4], color); imgContoursLabel.setIcon( new ImageIcon(HighGui.toBufferedImage(drawing))); frame.repaint(); public class GeneralContoursDemo2 < public static void main(String[] args) < // Load the native OpenCV library System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // Schedule a job for the event dispatch thread: // creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater( new Runnable() < public void run() < new GeneralContours2(args);

This tutorial code's is shown lines below. You can also download it from here

from __future__ import print_function import cv2 as cv import numpy as np import argparse import random as rng rng.seed(12345) def thresh_callback(val): threshold = val canny_output = cv.Canny(src_gray, threshold, threshold * 2) _, contours, _ = cv.findContours(canny_output, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # Find the rotated rectangles and ellipses for each contour minRect = [ None ]*len(contours) minEllipse = [ None ]*len(contours) for i, c in enumerate(contours): minRect[i] = cv.minAreaRect(c) if c.shape[0] > 5: minEllipse[i] = cv.fitEllipse(c) # Draw contours + rotated rects + ellipses drawing = np.zeros((canny_output.shape[0], canny_output.shape[1], 3), dtype=np.uint8) for i, c in enumerate(contours): color = (rng.randint(0,256), rng.randint(0,256), rng.randint(0,256)) cv.drawContours(drawing, contours, i, color) if c.shape[0] > 5: cv.ellipse(drawing, minEllipse[i], color, 2) # rotated rectangle box = cv.boxPoints(minRect[i])

box = np.intp(box) #np.intp: Integer used for indexing (same as C ssize_t; normally either int32 or int64)

cv.drawContours(drawing, [box], 0, color) cv.imshow( 'Contours' , drawing)

parser = argparse.ArgumentParser(description= 'Code for Creating Bounding rotated boxes and ellipses for contours tutorial.' )