Recycle previous corners on timeout
This commit is contained in:
parent
83c2dd859b
commit
ba3c9369e1
1 changed files with 16 additions and 5 deletions
21
bot.py
21
bot.py
|
@ -12,7 +12,6 @@ import cv2
|
|||
import numpy as np
|
||||
import telegram
|
||||
from aiohttp import BasicAuth
|
||||
from cv2 import aruco
|
||||
from pytapo import Tapo
|
||||
from telegram import Update, Message
|
||||
from telegram.ext import Updater
|
||||
|
@ -39,6 +38,8 @@ class Bot:
|
|||
self.tapo = Tapo(self.camera_ip, self.camera_user, self.camera_password)
|
||||
self.executor = ThreadPoolExecutor(max_workers=len(os.sched_getaffinity(0)))
|
||||
|
||||
self.last_aruco_corners = {}
|
||||
|
||||
def _get_presets(self):
|
||||
presets = self.tapo.getPresets()
|
||||
return {v: k for k, v in presets.items()}
|
||||
|
@ -93,13 +94,21 @@ class Bot:
|
|||
# Iterate until we find all 4 aruco markers or timeout
|
||||
aruco_corners = {}
|
||||
annotated_image = None
|
||||
aruco_dict = aruco.getPredefinedDictionary(aruco.DICT_6X6_250)
|
||||
aruco_params = aruco.DetectorParameters()
|
||||
aruco_dict = a.getPredefinedDictionary(a.DICT_6X6_250)
|
||||
aruco_params = a.DetectorParameters()
|
||||
|
||||
t0 = time.time()
|
||||
print("Taking image with ArUco markers...")
|
||||
while len(aruco_corners) < 4:
|
||||
if time.time() - t0 > timeout:
|
||||
a = self.last_aruco_corners.copy()
|
||||
a.update(aruco_corners)
|
||||
aruco_corners = a
|
||||
|
||||
if len(aruco_corners) == 4:
|
||||
print("Timeout waiting for ArUco markers, using cached corners")
|
||||
break
|
||||
|
||||
print(
|
||||
"Timeout waiting for ArUco markers, returning only original image"
|
||||
)
|
||||
|
@ -112,7 +121,7 @@ class Bot:
|
|||
continue
|
||||
|
||||
# Detect the markers
|
||||
corners, ids, rejected = aruco.detectMarkers(
|
||||
corners, ids, rejected = a.detectMarkers(
|
||||
annotated_image, aruco_dict, parameters=aruco_params
|
||||
)
|
||||
for corner, i in zip(corners, ids):
|
||||
|
@ -129,7 +138,7 @@ class Bot:
|
|||
|
||||
corners = [aruco_corners[i] for i in range(1, 5)]
|
||||
ids = np.array([[i] for i in range(1, 5)])
|
||||
aruco.drawDetectedMarkers(annotated_image, corners, ids)
|
||||
a.drawDetectedMarkers(annotated_image, corners, ids)
|
||||
|
||||
# Annotate the image with the detected markers and apply the perspective transform to the pretty image
|
||||
|
||||
|
@ -173,6 +182,8 @@ class Bot:
|
|||
matrix = cv2.getPerspectiveTransform(expanded_rectangle_points, dst_pts)
|
||||
warped = cv2.warpPerspective(pretty_image, matrix, (width, height))
|
||||
|
||||
self.last_aruco_corners = aruco_corners
|
||||
|
||||
return [warped, annotated_image]
|
||||
|
||||
async def _photo_command(self, chat_id: int, adjust_perspective: bool = True):
|
||||
|
|
Loading…
Reference in a new issue