2017-02-23 59 views
2

Я хочу создать маску эллипса для обрезки изображения, чтобы отображалось только содержимое внутри эллипса.OpenCV - Эллипс вообще не отображается

Не могли бы вы проверить мой код?

public static Mat cropImage(Mat imageOrig, MatOfPoint contour){ 
    Rect rect = Imgproc.boundingRect(contour); 

    MatOfPoint2f contour2f = new MatOfPoint2f(contour.toArray()); 
    RotatedRect boundElps = Imgproc.fitEllipse(contour2f); 

    Mat out = imageOrig.submat(rect); 

    // the line function is working 
    Imgproc.line(out, new Point(0,0), new Point(out.width(), out.height()), new Scalar(0,0,255), 5); 

    // but not this one 
    Imgproc.ellipse(out, boundElps, new Scalar(255, 0, 0), 99); 

    return out; 
}//cropImage 

Похоже, что он вообще не работает. Хотя вы можете увидеть функцию линии, которую я сделал, чтобы проверить, работает ли она над правильным изображением, и я вижу строку, но нет эллипса.

Вот пример вывода моей функции cropImage.

cropImage's Output

ТИА

+1

Дон Обрезать изображение. Вы получаете координаты эллипса в системе координат imageOrig. Если вы хотите показать эллипс на обрезке, вам нужно перевести центр эллипса, например: 'boundElps.center(). X - = rect.x; boundElps.center(). y - = rect.y; ' – Miki

+0

Эй, @ Мики, вы должны сделать так ответ! Это решило мою проблему! Спасибо! –

+0

Рад, что это помогло. Добавлено в ответ, а затем – Miki

ответ

1

Вы получаете координаты эллипса в системе координат imageOrig, но вы показываете ее на обрезаемом изображении out.

Если вы хотите, чтобы показать овал на урожай, вам нужно перевести Эллипс центр на счет для перевода введенной культуры (в левом верхнем углу координаты rect), что-то вроде:

boundElps.center().x -= rect.x; boundElps.center().y -= rect.y; 
+0

Спасибо @Miki! –

0

Вы можете попробовать это:

RotatedRect rRect = Imgproc.minAreaRect(contour2f); 
Imgproc.ellipse(out, rRect , new Scalar(255, 0, 0), 3); 
+0

Все еще ничего :( –

+0

Он должен работать, вы меняете толщину и повторите попытку –

+0

Я уже изменил толщину вокруг 2-20, и у меня все еще нет ничего. :( –

0

Вы должны проверить минимальные требования для использования fitEllipse, как показано на this post. Функция fitEllipse требует как минимум 5 баллов. Примечание. Хотя упоминание, которое я упоминаю для Python, я надеюсь, что вы можете сделать то же самое для Java.

for cnt in contours: 
    area = cv2.contourArea(cnt) 
    # Probably this can help but not required 
    if area < 2000 or area > 4000: 
     continue 
    # This is the check I'm referring to 
    if len(cnt) < 5: 
     continue 
    ellipse = cv2.fitEllipse(cnt) 
    cv2.ellipse(roi, ellipse, (0, 255, 0), 2) 

Надеюсь, это поможет!

+0

Я думаю, что если точки не превышают 5, у меня будет ошибка «Я столкнулся с этим раньше, и я думаю, что я уже фильтровал все контуры, у которых меньше 5. Спасибо! –

+1

И я бы сказал, что вы должны нарисовать эллипс в исходном изображении, нет t на обрезанное изображение. Думаю, ты это делаешь. 'Imgproc.ellipse (imgOrig, boundElps, новый Scalar (0,255,0), 2)' должен работать. В противном случае измените координаты на локальную систему координат –

Смежные вопросы