Пытаюсь переписать свой код на Java.

Вопрос или проблема

Вот мой код, кто-нибудь знает, как это преобразовать в Java? Я пытаюсь найти расстояние между цветным блоком и камерой. Он создает маску, которая настроена на отображение определенного диапазона значений HSV, чтобы соответствовать конкретному цвету, а затем использует информацию с нашей конкретной веб-камеры для определения расстояния.

**import numpy as np
import cv2

Определить специфические переменные объекта

dist = 0
focal = 738
pixels = 30
width = 3.81

найти расстояние от камеры

def get_dist(rectange_params, image):
# найдем количество покрытых пикселей
pixels = rectange_params[1][0]
print(pixels)
# рассчитаем расстояние
dist = (width * focal) / pixels
# Записать в изображение
image = cv2.putText(image, ‘Расстояние от камеры в см:’, org, font,
1, color, 2, cv2.LINE_AA)
image = cv2.putText(image, str(dist), (110, 50), font,
fontScale, color, 1, cv2.LINE_AA)
return image

Извлечь кадры

cap = cv2.VideoCapture(1)

основные константы для функций opencv

kernel = np.ones((3, 3), ‘uint8’)
font = cv2.FONT_HERSHEY_SIMPLEX
org = (0, 20)
fontScale = 0.6
color = (0, 0, 255)
thickness = 2
cv2.namedWindow(‘Измерение расстояния до объекта’, cv2.WINDOW_NORMAL)
cv2.resizeWindow(‘Измерение расстояния до объекта’, 700, 600)

цикл для захвата видеокадров

while True:
ret, img = cap.read()
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# предопределенная маска для детекции синего цвета
lower = np.array([83, 85, 160])
upper = np.array([139, 255, 255])
mask = cv2.inRange(hsv_img, lower, upper)
# Удаление лишнего мусора с изображения
d_img = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=5)
# найти гистограмму
cont, hie = cv2.findContours(d_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# cont = sorted(cont, key = cv2.contourArea, reverse = True)[:1]
for cnt in cont:
# проверить площадь контура
if (cv2.contourArea(cnt) > 100 and cv2.contourArea(cnt) < 306000): # Нарисовать прямоугольник на контуре rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) if box is None: print('Привет, Джордже') box = np.int32(box) cv2.drawContours(img, [box], 0, (0, 0, 255), 3) img = get_dist(rect, img) cv2.imshow('Измерение расстояния до объекта', img) if cv2.waitKey(1) & 0xFF == ord('q'): break

cv2.destroyAllWindows()**

Ответ или решение

Как преобразовать код Python в Java для измерения расстояния до объекта

Ваша задача заключается в преобразовании кода, написанного на Python с использованием библиотеки OpenCV, в эквивалентный код на Java. Рассмотрим основные этапы и подходы, которые вам нужно будет учесть в процессе конвертации.

Понимание исходного кода

Исходный код выполняет следующие функции:

  1. Импорт библиотек: Используются numpy и cv2 для обработки изображений.
  2. Определение переменных: Устанавливаются переменные, такие как фокусное расстояние и ширина объекта.
  3. Извлечение дистанции: Функция get_dist принимает параметры прямоугольника и изображение, чтобы вычислить расстояние до объекта на основе количества пикселей.
  4. Обработка видеопотока: код использует cv2.VideoCapture для захвата изображений с веб-камеры, применяет маску для извлечения определённого цвета и находит контуры объектов.

Конвертация кода

Для преобразования данного кода в Java, вам понадобятся следующие библиотеки:

  1. OpenCV Java: Для обработки изображений и видеопотока.
  2. JavaCV: Для использования функций, аналогичных OpenCV на Python.
Пример кода на Java
import org.opencv.core.*;
import org.opencv.imgproc.Imgproc;
import org.opencv.highgui.HighGui;
import org.opencv.videoio.VideoCapture;

public class DistanceMeasurement {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    private static final int FOCAL = 738;
    private static final double WIDTH = 3.81;

    public static void main(String[] args) {
        VideoCapture cap = new VideoCapture(1);
        Mat img = new Mat();
        Mat hsvImg = new Mat();
        Mat mask = new Mat();
        Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));

        if (!cap.isOpened()) {
            System.out.println("Error: Camera not found");
            return;
        }

        while (true) {
            cap.read(img);
            Imgproc.cvtColor(img, hsvImg, Imgproc.COLOR_BGR2HSV);
            Scalar lower = new Scalar(83, 85, 160);
            Scalar upper = new Scalar(139, 255, 255);
            Core.inRange(hsvImg, lower, upper, mask);

            // Фильтрация изображения
            Imgproc.morphologyEx(mask, mask, Imgproc.MORPH_OPEN, kernel);
            List<MatOfPoint> contours = new ArrayList<>();
            Mat hierarchy = new Mat();
            Imgproc.findContours(mask, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);

            for (MatOfPoint contour : contours) {
                double area = Imgproc.contourArea(contour);
                if (area > 100 && area < 306000) {
                    RotatedRect rect = Imgproc.minAreaRect(new MatOfPoint2f(contour.toArray()));
                    Point[] boxPoints = new Point[4];
                    rect.points(boxPoints);
                    for (int j = 0; j < 4; j++) {
                        Imgproc.line(img, boxPoints[j], boxPoints[(j + 1) % 4], new Scalar(0, 0, 255), 3);
                    }
                    img = getDist(rect, img);
                }
            }
            HighGui.imshow("Object Dist Measure", img);
            if (HighGui.waitKey(1) == 'q') break;
        }
        cap.release();
        HighGui.destroyAllWindows();
    }

    private static Mat getDist(RotatedRect rectangleParams, Mat image) {
        double pixels = rectangleParams.size.width; // Параметры размерами в пикселях
        double dist = (WIDTH * FOCAL) / pixels;
        int fontFace = Imgproc.FONT_HERSHEY_SIMPLEX;
        Imgproc.putText(image, "Distance from Camera in CM: " + dist,
                new Point(10, 20), fontFace, 0.6, new Scalar(0, 0, 255), 2);
        return image;
    }
}

Обзор Java кода

  • Импорт необходимых классов: Мы импортируем классы из OpenCV, необходимые для обработки изображений и видео.
  • Загрузка библиотеки: Используем System.loadLibrary для загрузки библиотеки OpenCV.
  • Основной цикл: Мы захватываем кадры через VideoCapture и применяем обработку изображений. Используем Imgproc для обработки и поиска контуров.
  • Функция измерения расстояния: Реализуем логику из Python, но адаптируем синтаксис и методы для Java.

Заключение

Перетасовка кода из Python в Java может показаться сложной задачей из-за различных библиотек и стилей программирования. Однако, следуя структуре и методам, изложенным выше, вы можете успешно создать аналогичную программу для измерения расстояния до объекта с помощью Java и OpenCV. Не забудьте протестировать свой код для гарантии его корректности и значения измерений!

Оцените материал
Добавить комментарий

Капча загружается...