OpenCV не добавляет линии и точки на изображении - PullRequest
2 голосов
/ 11 февраля 2020

Я работаю с алгоритмом SparseOptFlow. Я хочу отследить некоторые углы и показать их на изображении в режиме реального времени.

Это очень хорошо сработало с видео .avi, сейчас я работаю с последовательностью тиффов. Происходит то, что он не хочет показывать отслеживаемый ЗЕЛЕНЫЙ угол на изображении, даже если он имеет угол и код правильный.

Вот код:

color = (0, 255, 0)                                                                 # Corner colors (green)
[.....]
while(totAnalyzedFrame[nucleo]<totFrame):
            # ret = a boolean return value from getting the frame, frame = the current frame being projected in the video
            try:
                frame = VideoToSOF[totAnalyzedFrame[nucleo]]
            except Exception as e:
                print("Frame finished...Exception:")
                print(e)

            # Converts each frame to grayscale - we previously only converted the first frame to grayscale (cv.cvtColor(frame, cv.COLOR_BGR2GRAY), tiff already in grayscale)
            gray = frame
            # Calculates sparse optical flow by Lucas-Kanade method
            # https://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowpyrlk
            next, status, error = cv.calcOpticalFlowPyrLK(prev_gray, gray, prev, None, **lk_params)

            #Save the information of the corners
            for i in range(len(next)):
                cornerPosition[nucleo][totAnalyzedFrame[nucleo]][i][0] = next[i][0][0]    # X pos of i_th corner 
                cornerPosition[nucleo][totAnalyzedFrame[nucleo]][i][1] = next[i][0][1]    # Y pos of i_th corner
                if next[i][0][0] <= 0 or next[i][0][1] <= 0:
                    printf("Got a '0': frame = %d, X = %d, Y = %d " % (i,next[i][0][0],next[i][0][1]))

            # Selects good feature points for previous position
            good_old = prev[status == 1]
            # Selects good feature points for next position
            good_new = next[status == 1]
            # Draws the optical flow tracks
            for i, (new, old) in enumerate(zip(good_new, good_old)):
                # Returns a contiguous flattened array as (x, y) coordinates for new point
                a, b = new.ravel()
                # Returns a contiguous flattened array as (x, y) coordinates for old point
                c, d = old.ravel()
                # Draws line between new and old position with green color and 1 thickness
                mask = cv.line(mask, (a, b), (c, d), color, 1)
                # Draws filled circle (thickness of -1) at new position with green color and radius of 2
                frame = cv.circle(frame, (a, b), 2, color, -1)
            # Overlays the optical flow tracks on the original frame
            output = cv.add(frame, mask)
            # Updates previous frame
            prev_gray = gray.copy()
            # Updates previous good feature points
            prev = good_new.reshape(-1, 1, 2)
            # Opens a new window and displays the output frame
            cv.imshow("sparse optical flow", output)
            # Frames are read by intervals of 10 milliseconds. The programs breaks out of the while loop when the user presses the 'q' key
            if cv.waitKey(1) & 0xFF == ord('q'):
                np.delete(prev, [])
                break

            totAnalyzedFrame[nucleo] = totAnalyzedFrame[nucleo] + 1
            print("SOF working... Frame =  %d/%d\t\t\t[press 'q' to quit]" % (totAnalyzedFrame[nucleo],totFrame), end='\r')
    else:
        print("No corner found @ nucleo %d" % nucleo+1)
        pass 

Как Вы можете видеть, что я читаю углы и пытаюсь добавить это (линия и круги) к изображению, затем показать изображение. Угол существует, и изображение показывается, но не отображается ЗЕЛЕНЫЙ угол. Все они черные ...

Вот результат: изображение показывается, отслеживание работает, зеленый угол и отслеживаемая линия не отображаются, даже если они существуют.

not a corner

Любые предложения?

PS: я уверен, что код работает, потому что я тестировал его с .avi, как только я поставил .tiff, он начал с проблем. Tiff - это только серая шкала, поэтому, возможно, он не может показывать зеленые точки.

1 Ответ

2 голосов
/ 12 февраля 2020

Как вы упомянули, вы не можете наносить зеленый цвет на градации серого.

Решение заключается в преобразовании изображения из градаций серого в формат BGR и нанесении на изображение BGR.

Пример:
При построении графика в оттенках серого получается черный кружок:

import numpy as np
import cv2 as cv

color = (0, 255, 0)

# Read image as Grayscale
gray = cv.imread('chelsea.png', cv.IMREAD_GRAYSCALE)

rows, cols = gray.shape

gray = cv.circle(gray, (cols//2, rows//2), rows//4, color, thickness=8)

cv.imshow('gray', gray)
cv.waitKey(0)
cv.destroyAllWindows()

Результат:
enter image description here

Решение:
Преобразование формы Оттенки серого в BGR (где r = g = b для каждого пикселя) и нанесение на изображение BGR:

gray = cv.imread('chelsea.png', cv.IMREAD_GRAYSCALE)    
rows, cols = gray.shape

# Convert from Grayscale format to BGR format, where r=g=b for each pixel
bgr = np.dstack((gray, gray, gray))

# Plot the circle on the BGR image:  
bgr = cv.circle(bgr, (cols//2, rows//2), rows//4, color, thickness=8)

cv.imshow('bgr', bgr)
cv.waitKey(0)
cv.destroyAllWindows()

Результат:
enter image description here

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