add taking picture with fswebcam

This commit is contained in:
Sem van der Hoeven
2023-05-10 11:27:38 +02:00
parent fdab7ff112
commit 6c4050742b
2 changed files with 33 additions and 31 deletions

View File

@@ -2,10 +2,11 @@ import rclpy
from rclpy.node import Node from rclpy.node import Node
from drone_services.srv import TakePicture from drone_services.srv import TakePicture
import os
import cv2
from datetime import datetime from datetime import datetime
# import cv2
RES_4K_H = 3496 RES_4K_H = 3496
RES_4K_W = 4656 RES_4K_W = 4656
@@ -13,13 +14,13 @@ RES_4K_W = 4656
class CameraController(Node): class CameraController(Node):
def __init__(self): def __init__(self):
super().__init__('camera_controller') super().__init__('camera_controller')
self.capture = cv2.VideoCapture(0,cv2.CAP_DSHOW) # self.capture = cv2.VideoCapture(0,cv2.CAP_DSHOW)
CAMERA_PROP_WIDTH = 3 # CAMERA_PROP_WIDTH = 3
CAMERA_PROP_HEIGHT = 4 # CAMERA_PROP_HEIGHT = 4
self.capture.set(CAMERA_PROP_WIDTH, RES_4K_W) # self.capture.set(CAMERA_PROP_WIDTH, RES_4K_W)
self.capture.set(CAMERA_PROP_HEIGHT, RES_4K_H) # self.capture.set(CAMERA_PROP_HEIGHT, RES_4K_H)
self.get_logger().info("Camera resolution set to " + str(self.capture.get(CAMERA_PROP_WIDTH)) + "x" + str(self.capture.get(CAMERA_PROP_HEIGHT))) # self.get_logger().info("Camera resolution set to " + str(self.capture.get(CAMERA_PROP_WIDTH)) + "x" + str(self.capture.get(CAMERA_PROP_HEIGHT)))
self.get_logger().info("Camera controller started. Waiting for service call...") self.get_logger().info("Camera controller started. Waiting for service call...")
self.srv = self.create_service(TakePicture, 'drone/picture', self.take_picture_callback) self.srv = self.create_service(TakePicture, 'drone/picture', self.take_picture_callback)
@@ -31,12 +32,13 @@ class CameraController(Node):
self.get_logger().info("Taking picture with default filename") self.get_logger().info("Taking picture with default filename")
now = datetime.now().strftime("droneimage_%Y-%m-%d_%H-%M-%S") now = datetime.now().strftime("droneimage_%Y-%m-%d_%H-%M-%S")
imagename = "/home/ubuntu/drone_img" + now + ".jpg" imagename = "/home/ubuntu/drone_img" + now + ".jpg"
image = self.maintain_aspect_ratio_resize(image, width=RES_4K_W, height=RES_4K_H) # image = self.maintain_aspect_ratio_resize(image, width=RES_4K_W, height=RES_4K_H)
cv2.imwrite(imagename, image) # cv2.imwrite(imagename, image)
response.filename = imagename response.filename = imagename
else: else:
cv2.imwrite(request.input_name, image) # cv2.imwrite(request.input_name, image)
response.filename = request.input_name response.filename = request.input_name
os.system('fswebcam -r 4656x3496 ' + response.filename)
self.get_logger().info("Picture saved as " + response.filename) self.get_logger().info("Picture saved as " + response.filename)
else: else:
self.get_logger().error("Could not take picture") self.get_logger().error("Could not take picture")
@@ -44,28 +46,28 @@ class CameraController(Node):
return response return response
def maintain_aspect_ratio_resize(self, image, width=None, height=None, inter=cv2.INTER_AREA): # def maintain_aspect_ratio_resize(self, image, width=None, height=None, inter=cv2.INTER_AREA):
# Grab the image size and initialize dimensions # # Grab the image size and initialize dimensions
dim = None # dim = None
(h, w) = image.shape[:2] # (h, w) = image.shape[:2]
# Return original image if no need to resize # # Return original image if no need to resize
if width is None and height is None: # if width is None and height is None:
return image # return image
# We are resizing height if width is none # # We are resizing height if width is none
if width is None: # if width is None:
# Calculate the ratio of the height and construct the dimensions # # Calculate the ratio of the height and construct the dimensions
r = height / float(h) # r = height / float(h)
dim = (int(w * r), height) # dim = (int(w * r), height)
# We are resizing width if height is none # # We are resizing width if height is none
else: # else:
# Calculate the ratio of the 0idth and construct the dimensions # # Calculate the ratio of the 0idth and construct the dimensions
r = width / float(w) # r = width / float(w)
dim = (width, int(h * r)) # dim = (width, int(h * r))
# Return the resized image # # Return the resized image
return cv2.resize(image, dim, interpolation=inter) # return cv2.resize(image, dim, interpolation=inter)
def main(args=None): def main(args=None):