diff options
Diffstat (limited to 'WPIJavaCV/src/edu/wpi/first/wpijavacv/WPIPolygon.java')
-rw-r--r-- | WPIJavaCV/src/edu/wpi/first/wpijavacv/WPIPolygon.java | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/WPIJavaCV/src/edu/wpi/first/wpijavacv/WPIPolygon.java b/WPIJavaCV/src/edu/wpi/first/wpijavacv/WPIPolygon.java new file mode 100644 index 0000000..a54a297 --- /dev/null +++ b/WPIJavaCV/src/edu/wpi/first/wpijavacv/WPIPolygon.java @@ -0,0 +1,126 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package edu.wpi.first.wpijavacv; + +import static com.googlecode.javacv.cpp.opencv_imgproc.*; +import static com.googlecode.javacv.cpp.opencv_core.*; + +/** + * A class that represents a polygon, can be obtained from approxPolygon() + * in WpiContour + * @author Greg Granito + */ +public class WPIPolygon extends WPIDisposable { + + CvSeq polygon; + CvRect boundingRect; + + WPIPolygon(CvSeq data) { + polygon = data; + } + + CvSeq getCVSeq() { + return polygon; + } + + /** + * + * @return an array of WpiPoints of the vertices of the polygon + */ + public WPIPoint[] getPoints() { + CvPoint points = new CvPoint(getNumVertices()); + WPIPoint[] wpiPoints= new WPIPoint[getNumVertices()]; + cvCvtSeqToArray(polygon, points.position(0), CV_WHOLE_SEQ); + for (int j = 0; j < getNumVertices(); j++) { + + wpiPoints[j] = new WPIPoint(points.position(j).x(), points.position(j).y()); + + } + return wpiPoints; + } + + /** + * + * @return the width of the bounding rectangle of the polygon + */ + public int getWidth() { + if (boundingRect == null) { + boundingRect = cvBoundingRect(polygon, 0); + } + return boundingRect.width(); + } + + /** + * + * @return the height of the bounding rectangle of the polygon + */ + public int getHeight() { + if (boundingRect == null) { + boundingRect = cvBoundingRect(polygon, 0); + } + return boundingRect.height(); + } + + /** + * + * @return the x coord of the top left corner of the bounding + * rectangle of the polygon + */ + public int getX() { + if (boundingRect == null) { + boundingRect = cvBoundingRect(polygon, 0); + } + return boundingRect.x(); + } + + /** + * + * @return the y coord of the top left corner of the bounding + * rectangle of the polygon + */ + public int getY() { + if (boundingRect == null) { + boundingRect = cvBoundingRect(polygon, 0); + } + return boundingRect.y(); + } + + /** + * + * @return the number of vertices in the polygon + */ + public int getNumVertices() { + return polygon.total(); + + } + + /** + * + * @return whether or not the polygon is convex + */ + public boolean isConvex() { + return cvCheckContourConvexity(polygon) == 0 ? false : true; + } + + /** + * + * @return the area in pixels of the polygon + */ + public int getArea() { + return Math.abs((int) cvContourArea(polygon, CV_WHOLE_SEQ, -1)); + } + + /** + * + * @return the perimeter in pixels of the polygon + */ + public int getPerimeter() { + return (int) cvArcLength(polygon, CV_WHOLE_SEQ, -1); + } + + public void disposed() { + polygon.deallocate(); + } +} |