1 | initial version |
Yes i already use approxPolyDP() in my code
private boolean isRectangle(MatOfPoint2f polygon, int srcArea) {
MatOfPoint polygonInt = GeomUtils.toMatOfPointInt(polygon);
if (polygon.rows() != 4) {
return false;
}
double area = Math.abs(Imgproc.contourArea(polygon));
if (area < srcArea * areaLowerThresholdRatio || area > srcArea * areaUpperThresholdRatio) {
return false;
}
if (!Imgproc.isContourConvex(polygonInt)) {
return false;
}
// Check if the all angles are more than 72.54 degrees (cos 0.3).
double maxCosine = 0;
Point[] approxPoints = polygon.toArray();
for (int i = 2; i < 5; i++) {
double cosine = Math.abs(GeomUtils.angle(approxPoints[i % 4], approxPoints[i - 2], approxPoints[i - 1]));
maxCosine = Math.max(cosine, maxCosine);
}
if (maxCosine >= 0.3) {
return false;
}
return true;
}
Do you have any other working code then please tell me
Thanks
2 | No.2 Revision |
Yes @missing i already use approxPolyDP() in my code
private boolean isRectangle(MatOfPoint2f polygon, int srcArea) {
MatOfPoint polygonInt = GeomUtils.toMatOfPointInt(polygon);
if (polygon.rows() != 4) {
return false;
}
double area = Math.abs(Imgproc.contourArea(polygon));
if (area < srcArea * areaLowerThresholdRatio || area > srcArea * areaUpperThresholdRatio) {
return false;
}
if (!Imgproc.isContourConvex(polygonInt)) {
return false;
}
// Check if the all angles are more than 72.54 degrees (cos 0.3).
double maxCosine = 0;
Point[] approxPoints = polygon.toArray();
for (int i = 2; i < 5; i++) {
double cosine = Math.abs(GeomUtils.angle(approxPoints[i % 4], approxPoints[i - 2], approxPoints[i - 1]));
maxCosine = Math.max(cosine, maxCosine);
}
if (maxCosine >= 0.3) {
return false;
}
return true;
}
Do you have any other working code then please tell me
Thanks
3 | No.3 Revision |
Yes @missing i already use approxPolyDP() in my code
Imgproc.findContours(gray, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
int i=0;
for (MatOfPoint contour : contours) {
MatOfPoint2f contourFloat = GeomUtils.toMatOfPointFloat(contour);
double arcLen = Imgproc.arcLength(contourFloat, true) * 0.02;
// Approximate polygonal curves.
MatOfPoint2f approx = new MatOfPoint2f();
Imgproc.approxPolyDP(contourFloat, approx, arcLen, true);
if (isRectangle(approx, srcArea)) {
Imgproc.drawContours(src, contours, i, new Scalar(255, 0, 0), 3);
}
}
private boolean isRectangle(MatOfPoint2f polygon, int srcArea) {
MatOfPoint polygonInt = GeomUtils.toMatOfPointInt(polygon);
if (polygon.rows() != 4) {
return false;
}
double area = Math.abs(Imgproc.contourArea(polygon));
if (area < srcArea * areaLowerThresholdRatio || area > srcArea * areaUpperThresholdRatio) {
return false;
}
if (!Imgproc.isContourConvex(polygonInt)) {
return false;
}
// Check if the all angles are more than 72.54 degrees (cos 0.3).
double maxCosine = 0;
Point[] approxPoints = polygon.toArray();
for (int i = 2; i < 5; i++) {
double cosine = Math.abs(GeomUtils.angle(approxPoints[i % 4], approxPoints[i - 2], approxPoints[i - 1]));
maxCosine = Math.max(cosine, maxCosine);
}
if (maxCosine >= 0.3) {
return false;
}
return true;
}
Do you have any other working code then please tell me
Thanks