OpenCV: Manually Control Cameras Field of View

OpenCV Control Camera

Mastering Manual Interaction for Dynamic Surveillance

Step into the driver’s seat of your dynamic vision setup as we explore the thrilling realm of manual control. In this guide, we’ll dive into the process of harnessing the power of keyboard inputs to navigate and control pan/tilt servos and a camera in real-time using OpenCV with Python. From understanding the key mapping to implementing responsive servo movements, this tutorial puts you in command, opening up a world of possibilities for interactive surveillance and dynamic vision applications. Let’s embark on the journey of hands-on control!

What’s Covered

  • Key Mapping.
  • The Control Program.

Key Mapping

We can easily find a keys corresponding key code with a simple Python script:

import cv2

print('Starting Key Test')
camera=cv2.VideoCapture(0)

while(1):
    ret,frame=camera.read()
    cv2.imshow('Camera',frame)
    k = cv2.waitKey(33)
    if k==27:    # Esc key to stop
        break
    elif k==-1:  # normally -1 returned,so don't print it
        continue
    else:
        print (k) # else print its value

In the above example, when the code is run, the camera stream will open. While the camera stream is open, if any key on your keyboard is pressed, the corresponding key value will be printed to the terminal console.

Manually Control Pan/Tilt Servos Program

Hopefully, your key codes are the same as in the code below, but just in case they are not you can use the key mapping code above to find their code values.

Open Visual Studio then copy and paste the code below. In the Python code below, you now have complete manual control for the field-of-view the camera has by simple using the cursor keys on a keyboard.

Python Code:
import cv2
import os
from adafruit_servokit import ServoKit

#Servo settings
pan=100
tilt=150
kit=ServoKit(channels=16)
kit.servo[0].angle=pan
kit.servo[1].angle=tilt

#Camera settings
height=480
width=640
camera = cv2.VideoCapture(0)
camera.set(cv2.CAP_PROP_FRAME_WIDTH,width)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT,height)

while True:
    ret, frame=camera.read()  
    cv2.imshow('PanTilt',frame)
    kit.servo[0].angle=pan
    kit.servo[1].angle=tilt

    #Use OpenCV waitkey for user control 
    k = cv2.waitKey(33)

    #Terminate program
    if k==27: #27 = ESC key
        break
    
    #Servo control
    if k==81: #81 = left cursor key
        pan+=5
        print(pan)
    if k==83: #83 = right cursor key
        pan=pan-5
        print(pan)
    if k==84: #84 = down cursor key
        tilt+=5
        print(tilt)
    if k==82: #82 = up cursor key
        tilt=tilt-5
        print(tilt)

    #Set range limits to stop out of range errors
    if pan>170:
        pan=170
        print('pan out of range')
    if pan<0: 
        pan=0 
        print('pan out of range') 
    if tilt>180:
        tilt=180
        print('tilt out of range')
    if tilt<0:
        tilt=0
        print('tilt out of range')

     
camera.release()
cv2.destroyAllWindows()

#Reset servos
kit.servo[0].angle=100
kit.servo[1].angle=150

print('Program Terminated')

Conclusion

Congratulations, commander of vision! You’ve successfully unlocked the potential of hands-on control, steering your pan/tilt servos and camera with the precision of keyboard inputs using OpenCV with Python. By mastering this manual interaction, your projects are now poised for dynamic surveillance and real-time responsiveness.

As we conclude this journey of hands-on control, stay tuned for our finale post in this OpenCV for Beginners guide where we’ll explore our last avenue of dynamic vision. Happy navigating, and may your projects thrive with interactive ingenuity!

In the last installment for our OpenCV for Beginners guide we will be Creating a Zoom Function for our camera projects.

That’s All Folks!

You can find all of our OpenCV guides here: OpenCV for Beginners

Luke Barber

Hello, fellow tech enthusiasts! I'm Luke, a passionate learner and explorer in the vast realms of technology. Welcome to my digital space where I share the insights and adventures gained from my journey into the fascinating worlds of Arduino, Python, Linux, Ethical Hacking, and beyond. Armed with qualifications including CompTIA A+, Sec+, Cisco CCNA, Unix/Linux and Bash Shell Scripting, JavaScript Application Programming, Python Programming and Ethical Hacking, I thrive in the ever-evolving landscape of coding, computers, and networks. As a tech enthusiast, I'm on a mission to simplify the complexities of technology through my blogs, offering a glimpse into the marvels of Arduino, Python, Linux, and Ethical Hacking techniques. Whether you're a fellow coder or a curious mind, I invite you to join me on this journey of continuous learning and discovery.

Leave a Reply

Your email address will not be published. Required fields are marked *

Verified by MonsterInsights