Я пытаюсь перевести свой код Python (для обработки изображений OpenCV) на Android
Это мой код Python
image = cv2.imread("x.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 200, 50)
cv2.imwrite("edged.jpg", edged)
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
displayCnt = None
print (len(cnts))
# loop over the contours
for c in cnts:
# approximate the contour
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
# if the contour has four vertices, then we have found
# the thermostat display
if len(approx) == 4:
displayCnt = approx
break
output = four_point_transform(image, displayCnt.reshape(4, 2))
и вот мой код Java
Imgproc.cvtColor(src, src, Imgproc.COLOR_BGRA2GRAY);
Imgproc.GaussianBlur(src, src, new Size(5,5),0);
Imgproc.Canny(src,src,50,200);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(src, contours, hierarchy, Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_SIMPLE);
hierarchy.release();
sortContoursByArea(contours);
for(int c = 0; c < contours.size(); c++)
{
MatOfPoint2f approxCurve = new MatOfPoint2f();
MatOfPoint2f contour2f = new MatOfPoint2f(contours.get(c).toArray());
double approxDistance = Imgproc.arcLength(contour2f, true)*0.02;
Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);
if (approxCurve.toArray().length==4){
MatOfPoint points = new MatOfPoint( approxCurve.toArray() );
// Get bounding rect of contour
Rect rect = Imgproc.boundingRect(points);
src = new Mat(src2, rect);
Toast.makeText(MainActivity.this,rect.width+" "+rect.x, Toast.LENGTH_LONG).show();
break;
}
}
это мое изображение после некоторой обработки
Обрезное изображение:
(выглядит хорошо)
и вот что я получаю в Python (это требуемый вывод) и что я получаю в Java
Результат
как я могу получить тот же результат в Java
редактировать
В MatOfPoint points = new MatOfPoint( approxCurve.toArray() );
я использую points.dump()
и вижу, что 4 точки находятся в правильном положении
моя проблема здесь
Rect rect = Imgproc.boundingRect(points);
src = new Mat(src2, rect);
Я думаю, он пытается создать квадрат, используя x, y, width, height, но это не так!
Как я могу обрезать свое изображение, используя четыре координаты точек MatOfPoint?