Я работаю с алгоритмом 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
Как Вы можете видеть, что я читаю углы и пытаюсь добавить это (линия и круги) к изображению, затем показать изображение. Угол существует, и изображение показывается, но не отображается ЗЕЛЕНЫЙ угол. Все они черные ...
Вот результат: изображение показывается, отслеживание работает, зеленый угол и отслеживаемая линия не отображаются, даже если они существуют.
Любые предложения?
PS: я уверен, что код работает, потому что я тестировал его с .avi, как только я поставил .tiff, он начал с проблем. Tiff - это только серая шкала, поэтому, возможно, он не может показывать зеленые точки.