Порт из кода Python (OpenCV) в Java (Android) - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь перевести свой код 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;
                    }
                }

это мое изображение после некоторой обработки

Обрезное изображение:

edged image

(выглядит хорошо)

и вот что я получаю в Python (это требуемый вывод) и что я получаю в Java

Результат

result

как я могу получить тот же результат в 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...