Plinge93 Skrevet 29. november 2016 Del Skrevet 29. november 2016 (endret) Ærede forum! Eg held på å lage eit bildestabilliserings-program i Python ved hjelp av Optical Flow i OpenCV, men får det ikkje til å fungere slik eg ønsker. Eg har snart googla meg tom, men finn ikkje noko som gjer meg noko klokare. Håper gjerne nokon av dykk har peiling på kva eg kan gjere for å få dette programmet til å fungere! Først har me testprogrammet: from stabilizer import Stabilizer import cv2 import sys from imutils.video import VideoStream import time imageCapture = cv2.VideoCapture(0) imageCapture.open(0) time.sleep(2.0) frame=0 counter=0 stabilizer=Stabilizer() while True: image=imageCapture.read() frame, result=stabilizer.stabilize(image, frame) cv2.imshow("Result", result) cv2.imshow("Image", image[1]) key = cv2.waitKey(1) & 0xFF # if the `q` key was pressed, break from the loop if key == ord("q"): break counter+=1 print counter print("[INFO] cleaning up...") cv2.destroyAllWindows() imageCapture.release() ... og her er det faktiske stabiliseringsprogrammet: import numpy as np import imutils import cv2 class Stabilizer: def stabilize(self,image, old_frame): # params for ShiTomasi corner detection feature_params = dict( maxCorners = 100,qualityLevel = 0.3,minDistance = 7,blockSize = 7 ) # Parameters for lucas kanade optical flow lk_params = dict( winSize = (15,15), maxLevel = 2, criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # Create some random colors color = np.random.randint(0,255,(100,3)) # Take first frame and find corners in it try: if old_frame==0: ret, old_frame = image except: print("tull") old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY) p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params) ret,frame = image frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # calculate optical flow p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params) # Select good points good_new = p1[st==1] good_old = p0[st==1] # Make 3x3 matrix h=cv2.findHomography(good_old,good_new) #h=cv2.getPerspectiveTransform(good_old,good_new) #not working # Now update the previous frame and previous points #old_gray = frame_gray.copy() #p0 = good_new.reshape(-1,1,2) #cv2.destroyAllWindows() result=cv2.warpPerspective(frame,h[0], (frame.shape[1],frame.shape[0])) return frame, result Eg har prøvd meg på følgande logikk: Ein får inn eit bilete, finn punkter (p0) å samanlikne. Første gongen vil det bli det same biletet, men neste gong loopen køyrer skal ein ha fått inn eit to ulike bilete med kvar sine punkter. Det vert kalkulert "Optical Flow" for desse punkta. Det vert laga ei 3x3 transformasjonsmatrise av denne Optical Flow. Biletet vert transformert med matrisa. Er det ein quick-fix på dette, eller har eg misforstått noko heilt fundamentalt? Eg set stor pris på hjelp! Endret 29. november 2016 av Plinge93 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå