add taking picture with fswebcam
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
Submodule src/px4_msgs updated: ffc3a4cd57...b64ef0475c
Reference in New Issue
Block a user