22 Mart 2018 Perşembe

OpenCV Countour

boundingRect metodu
Şöyle yaparız.
vector<vector<Point>> contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(img, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++) // iterate through each contour. 
{

  Rect bounding_rect;
  bounding_rect = boundingRect(contours[i]); //bounding rectangle for contour
}
Python'da şöyle yaparız.
x,y,w,h = cv2.boundingRect(cnt)
countourArea metodu
Şöyle yaparız.
for (unsigned int i = 0;  i < contours.size();  i++)
{
  std::cout << " Area: " << contourArea(contours[i]) << std::endl;
}
Şöyle yaparız.
vector<vector<Point>> contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(img, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++) // iterate through each contour. 
{

  double a = contourArea(contours[i], false); //area of contour

}
drawCountours metodu
Açıklaması şöyle.
drawContours function needs a vector of vector of cv::Point
Örnek
Yeşil renkte ve 2 kalınlığında ilk contour'u çizmek için şöyle yaparız.
std::vector<std::vector<cv::Point>> boxContours;
...

// there is only 1 contour inside, so always draw the 0-index contour!
cv::drawContours(image, boxContours, 0, cvScalar(0, 255, 0), 2);
Örnek
Şöyle yaparız.
drawContours(frame, contours, largest_contour_area_index, (0, 255, 0), 3);
findCountours metodu - input + output + mode + method
Şu satırı dahil ederiz.
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
mode olarak CV_RETR_EXTERNAL,CV_RETR_LIST, CVRETR_TREE verilebilir.

mode - CV_RETR_EXTERNAL 
CV_RETR_EXTERNAL sadece en dıştaki çizgileri bulur. Geometrik bir şeklin örneğin karenin içinde metin düşünelim. Bu seçenek ile sadece en dıştaki çizgiyi buluruz . Böylece ilgilenmedigimiz çizgiler karşımıza çıkmaz.

mode - CVRETR_LIST
Örnek ver

mode - CVRETR_TREE
CVRETR_TREE iç içe çizgileri ağaç şeklinde verir. Böylece bir çizginin içindeki nesneleri dolaşabiliriz 

Method
method olarak CV_CHAIN_APPROX_NONE,CHAIN_APPROX_SIMPLE verilebilir.
Şöyle yaparız.
Mat input = ...; 
bool externalOnly = ...;
vector<vector<Point> > contours;

int mode = externalOnly ? CV_RETR_EXTERNAL : CV_RETR_LIST;
int method = CHAIN_APPROX_SIMPLE;
cv::findContours(input, contours, mode, method);
Şöyle yaparız.
vector<vector<Point> > contours;
// Find contours and store them in a list
findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
Şöyle yaparız.
vector<vector<cv::Point> > contours;
cv::findContours(img, contours,  CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
findCountours metodu - input + output + hierarchy + mode + method
İmzası şöyle
findContours(InputOutputArray image, OutputArrayOfArrays contours,
 OutputArray hierarchy,int mode, int method, Point offset=Point());
Örnek - CV_RETR_CCOMP
Şöyle yaparız.
vector<vector<Point>> contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(imgCanny, contours, hierarchy,
  CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
Örnek - CV_RETR_LIST
Şöyle yaparız
vector<vector<cv::Point> > contours;
vector<Vec4i> hierarchy;

findContours(edged, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
Örnek
Java'da şöyle yaparız.
grayscale = inputFrame.gray();
Imgproc.Canny(grayscale, grayscale, 30, 200, 3, true);
Imgproc.findContours(grayscale, contours, hierarchy,
  Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
findCountours metodu - input + output + hierarchy + mode + method + point
Şöyle yaparız.
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

Mat input;

// Find contours
findContours(input, contours, hierarchy, 
  CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
minAreaRect metodu
Şöyle yaparız.
std::vector<std::vector<cv::Point > > contours;
cv::findContours(img, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);


// now draw all the bounding rects, using  drawContours function:
for (unsigned int i = 0; i < contours.size(); ++i)
{
  cv::RotatedRect rect = cv::minAreaRect(contours[i]);
  cv::Point2f points[4];
  rect.points(points);
  ...
}


Hiç yorum yok:

Yorum Gönder