Skip to content

Commit

Permalink
Add AxisCamera sample (#103)
Browse files Browse the repository at this point in the history
Addresses issue #49 [Axis Camera
Sample](https://github.com/wpilibsuite/allwpilib/tree/main/wpilibjExamples/src/main/java/edu/wpi/first/wpilibj/examples/axiscamera)
necessity! Could someone with a rio test the Axis Camera code because, I
do not have a rio or an axis camera currently.

---------

Co-authored-by: Dustin Spicuzza <[email protected]>
  • Loading branch information
Suave101 and virtuald authored Jan 8, 2024
1 parent e4aced8 commit 019de4c
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 0 deletions.
25 changes: 25 additions & 0 deletions AxisCamera/robot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/usr/bin/env python3
#
# Copyright (c) FIRST and other WPILib contributors.
# Open Source Software; you can modify and/or share it under the terms of
# the WPILib BSD license file in the root directory of this project.
#


import wpilib
import wpilib.cameraserver


class MyRobot(wpilib.TimedRobot):
"""
This is a demo program showing the use of OpenCV to do vision processing. The image is acquired
from the Axis camera, then a rectangle is put on the image and sent to the dashboard. OpenCV has
many methods for different types of processing.
"""

def robotInit(self):
# Your image processing code will be launched via a stub that will set up logging and initialize NetworkTables
# to talk to your robot code.
# https://robotpy.readthedocs.io/en/stable/vision/roborio.html#important-notes

wpilib.CameraServer.launch("vision.py:main")
65 changes: 65 additions & 0 deletions AxisCamera/vision.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#
# Copyright (c) FIRST and other WPILib contributors.
# Open Source Software; you can modify and/or share it under the terms of
# the WPILib BSD license file in the root directory of this project.
#


import ntcore
import numpy
from cscore import CameraServer
import cv2


#
# This code will work both on a RoboRIO and on other platforms. The exact mechanism
# to run it differs depending on whether you’re on a RoboRIO or a coprocessor
#
# https://robotpy.readthedocs.io/en/stable/vision/code.html


def main():
# Get the Axis camera from CameraServer
camera = CameraServer.addAxisCamera("axis-camera.local")

# Set the resolution
camera.setResolution(640, 480)

# Get a CvSink. This will capture Mats from the camera
cvSink = CameraServer.getVideo()

# Setup a CvSource. This will send images back to the Dashboard
outputStream = CameraServer.putVideo("Rectangle", 640, 480)

# Mats are very memory expensive. Lets reuse this Mat.
mat = numpy.zeros((480, 640, 3), dtype="uint8")

# Declare the color of the rectangle
rectColor = (255, 255, 255)

# The camera code will be killed when the robot.py program exits. If you wish to perform cleanup,
# you should register an atexit handler. The child process will NOT be launched when running the robot code in
# simulation or unit testing mode

while True:
# Tell the CvSink to grab a frame from the camera and put it in the source mat. If there is an error notify the
# output.

if cvSink.grabFrame(mat) == 0:
# Send the output the error.
outputStream.notifyError(cvSink.getError())

# skip the rest of the current iteration
continue

# Put a rectangle on the image
mat = cv2.rectangle(
img=mat,
pt1=(100, 100),
pt2=(400, 400),
color=rectColor,
lineType=5,
)

# Give the output stream a new image to display
outputStream.putFrame(mat)
1 change: 1 addition & 0 deletions run_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ BASE_TESTS="
ArcadeDrive
ArcadeDriveXboxController
ArmSimulation
AxisCamera
CANPDP
DifferentialDriveBot
DigitalCommunication
Expand Down

0 comments on commit 019de4c

Please sign in to comment.