Gå til innhold

[Python] Live bildestabilisering med OpenCV


Anbefalte innlegg

Æ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:

  1. 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.
  2. Det vert kalkulert "Optical Flow" for desse punkta.
  3. Det vert laga ei 3x3 transformasjonsmatrise av denne Optical Flow.
  4. 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 av Plinge93
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...