1 Вопрос: Как найти ярко-зеленую лазерную точку с помощью OpenCV?

вопрос создан в Wed, May 8, 2019 12:00 AM

Был код для обнаружения зеленой яркой лазерной точки в Android OpenCV, но он обнаруживал все, что когда-либо было зелеными цветами, я хочу обнаруживать только яркий лазер, что бы я ни делал, я публиковал его.

ЕСЛИ ЛЮБАЯ ССЫЛКА НА ЭТО, ПОЖАЛУЙСТА, ДАЙТЕ МНЕ ЗНАТЬ

 < code > введите описание изображения здесь < /code >

    Imgproc.cvtColor(gray, hsv, Imgproc.COLOR_RGB2HSV);
    Core.inRange(hsv, new Scalar(45,100, 100), new Scalar(75,255,255), 
    lowerRedRange);
    Imgproc.threshold(lowerRedRange, bw, 0, 255,Imgproc.THRESH_BINARY);
    // dilate canny output to remove potential
    // holes between edge segments
    Imgproc.dilate(bw, bw, new Mat(), new Point(-1, 1), 1);

    // find contours and store them all as a list
    List<MatOfPoint> contours = new ArrayList<>();
    contourImage = bw.clone();
    Imgproc.findContours(
            contourImage,
            contours,
            hierarchyOutputVector,
            Imgproc.RETR_EXTERNAL,
            Imgproc.CHAIN_APPROX_SIMPLE
    );

    // loop over all found contours
    for (MatOfPoint cnt : contours) {
        MatOfPoint2f curve = new MatOfPoint2f(cnt.toArray());

        // approximates a polygonal curve with the specified precision
        Imgproc.approxPolyDP(
                curve,
                approxCurve,
                0.02 * Imgproc.arcLength(curve, true),
                true
        );

        int numberVertices = (int) approxCurve.total();
        double contourArea = Imgproc.contourArea(cnt);

        Log.d(TAG, "vertices:" + numberVertices);
        // ignore to small areas
        if (Math.abs(contourArea) < 100
            // || !Imgproc.isContourConvex(
        ) {
            continue;}
        if (numberVertices >= 4 && numberVertices <= 6) {
        }

        else {// circle detection}
    
- 1
1 ответ                              1                         

Ваш цветовой диапазон недостаточно строг. На изображении ниже вы можете увидеть значения, которые я использовал. Круг вокруг точки на самом деле легче всего отделить. Точка сложнее, потому что она содержит очень белые цвета, то есть цвета с низкой насыщенностью. Но так же, как фон, так что используйте вместо этого кольцо.
Если вам нужна конкретная точка, вы можете использовать внутренний контур кольца.

Примечание: inRange возвращает двоичную маску, поэтому эта строка в вашем коде ничего не делает:
Imgproc.threshold(lowerRedRange, bw, 0, 255,Imgproc.THRESH_BINARY);

 введите описание изображения здесь

 введите описание изображения здесь

Обновление : запрос кода в комментариях.
Картинка с ползунками - это скрипт Python, который вы можете найти на GitHub
Код для детализации изображения с конечным результатом:

import cv2
import numpy as np  
# load image
img = cv2.imread("BPcph.jpg")
# convert to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
# set lower and upper color limits
lower_val = np.array([58,204,219])
upper_val = np.array([101,255,255])
# Threshold the HSV image 
mask = cv2.inRange(hsv, lower_val, upper_val)
# remove noise
kernel =  np.ones((5,5),np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# find contours in mask
im2, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# draw contours
for cnt in contours:
    cv2.drawContours(img,[cnt],0,(0,0,255),2)
#show image
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()    
    
1
2019-05-09 12: 23: 53Z
  1. Спасибо J D за ваш ценный ответ, пожалуйста, поделитесь некоторым кодом для этого, это действительно очень полезно для меня
    2019-05-09 05: 15: 17Z
  2. Конечно, я добавил его в ответ. Я использую Python, но его легко конвертировать.
    2019-05-09 12: 20: 27Z
  3. Спасибо за ваш ответ J.D, есть ли шанс, что вы можете помочь мне предоставить этот код в Android? Так как я не знаю, как работать с Python, я пытался, но не нашел конвертеров, которые могли бы конвертировать Python в Android. Благодаря
    2019-05-09 13: 13: 23Z
  4. Имена функций совпадают, вы уже использовали почти все те, которые я использовал. Если вы не знаете, как использовать функцию, найдите ее в документации . Замените мой код построчно, используя код, который вы сделали - пока смотрите, как он используется. Пример: у моего кода np.array(), то же самое делается с кодом new Scalar().
    2019-05-09 20: 39: 18Z
источник размещен Вот