Rewrite this python code cleanly and to work as a function like the example given afterwards.
Code to rewrite : 
import os
import sys
import imutils
import numpy as np
sys.path.append(os.getcwd() + "/../") #ce truc dégueulasse à été fait par Tim, je ne cautionne pas du tout
import main
import cv2
#cali\_1
mtx = np.array([[1.19126136e+03, 0.00000000e+00, 9.59240007e+02], [0.00000000e+00, 1.11365936e+03, 5.27377810e+02], [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
dist = np.array([[ 0.11751622, -0.4181012, -0.0034592, 0.0087792, 0.33441168]])

#cali\_2
#mtx = np.array([[1.19309855e+03, 0.00000000e+00, 7.84314808e+02], [0.00000000e+00, 1.11766414e+03, 5.62846555e+02], [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
#dist = np.array([[ 0.0091465, 0.15736172, -0.0010599, -0.00085758, -0.43462203]])
webcam = cv2.VideoCapture('trasnslation22s.video')
#webcam = cv2.VideoCapture(0, cv2.CAP\_V4L)
#img = webcam.read()
img = cv2.imread('1.jpeg')

h, w = img.shape[:2]
webcam.set(cv2.CAP\_PROP\_FRAME\_WIDTH, w)
webcam.set(cv2.CAP\_PROP\_FRAME\_HEIGHT, h)
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
while True:
 check, frame = webcam.read()
 if check:
 
 # undistort
 dst = cv2.undistort(frame, mtx, dist, None, newcameramtx)
 # crop the image
 x, y, w, h = roi
 frame = dst[y:y+h, x:x+w]
 
 frame = imutils.rotate(frame, 180)
 main.function(frame)
 frame = cv2.resize(frame, (860, 540))
 cv2.imshow('video', frame) 
 
 key = cv2.waitKey(1)
 if key==27:
 break

webcam.release()
cv2.destroyAllWindows()

Example code :
import cv2
from utils import toolkit
import numpy as np
from pathlib import Path 
from imutils.video import WebcamVideoStream
from imutils import rotate
from rich import print as rprint
from scipy.signal import savgol\_filter

def coord\_tag(dict,id1,id2,size1,size2,conn2=None,filter=False,src\_=0):

 # Load the necessary side functions and matrix for calibration
 tool = toolkit()
 cam\_mat = tool.mtx
 dist\_coef = tool.dist
 y1 = 70

 # Loading the dictionnary
 marker\_dict = cv2.aruco.Dictionary\_get(tool.ARUCO\_DICT[dict])

 # Savitzsky-Golay's filter parameters
 y\_raw\_value = []
 window\_size = 11
 sample\_size = 50
 polynomial\_order = 2

 # Load the video stream
 vs = WebcamVideoStream(src=src\_).start()

 # Create the parameters of the camera
 param\_markers = cv2.aruco.DetectorParameters\_create()

 # Displayed text parameters
 fontScale = 1.5
 precision = 3

 # Program loop 
 while True:

 # Reading the frame
 frame = vs.read()

 # Rotating the image (not important)
 frame =rotate(frame,180)

 # Adding a grey filter onto the frame
 gray\_frame = cv2.cvtColor(frame, cv2.COLOR\_BGR2GRAY)

 # Detect the tags on the image
 corners, ids, \_ = cv2.aruco.detectMarkers(
 gray\_frame, 
 marker\_dict,
 parameters=param\_markers
 )

 

 try:

 # To know which rvec to correspond to which id we make a dictionnary
 # Let's flatten the ids array
 ids\_flat = [ ui[0] for ui in ids]

 # Make a dictionnary for ease of use 
 ind\_id = { id: i for (i,id) in enumerate(ids\_flat) }

 # Create two separate lists for the markers with different ids and sizes
 corners1 = corners[ind\_id[id1]]
 corners2 = corners[ind\_id[id2]]
 
 
 # If the 2 tags specified have been detected then we enter the main program
 if ([id1] in ids) and ([id2] in ids):

 # Estimate the poses of the markers
 rvecs1, tvecs1, \_ = cv2.aruco.estimatePoseSingleMarkers(
 corners1,
 size1, 
 cam\_mat,
 dist\_coef)
 rvecs2, tvecs2, \_ = cv2.aruco.estimatePoseSingleMarkers(
 corners2,
 size2, 
 cam\_mat,
 dist\_coef)

 # Compute the homogeneous matrix 
 # Normally noglitches can happen here but be careful if there are several 
 # reference tags with the same id 
 
 # Since there is only one tag per pose estimation we use index 0
 H = tool.Homogeneous(rvecs1[0],tvecs1[0])
 
 # Pass tvec2 as homogenous
 tv = np.array([
 tvecs2[0][0][0],
 tvecs2[0][0][1],
 tvecs2[0][0][2],
 1])

 # Compute the tag 2 coordinates in tag 1 system of coordinates
 Tvec\_id2\_ref\_id1 = np.dot(tv,H)
 Tvec\_id2\_ref\_id1 = Tvec\_id2\_ref\_id1[0:3]/Tvec\_id2\_ref\_id1[3]
 
 # Draw pose of the tags : red = Ox | green = Oy | blue = Oz 
 frame = cv2.aruco.drawDetectedMarkers(frame, corners, ids)
 frame = cv2.drawFrameAxes(frame, cam\_mat, dist\_coef, rvecs1, tvecs1, 0.1, 1)
 frame = cv2.drawFrameAxes(frame, cam\_mat, dist\_coef, rvecs2, tvecs2, 0.1, 1)

 # Extracting the bottom right coordinates of Tag 2 to plot text
 corners2 = corners2[0].reshape(4,2)
 corners2 = corners2.astype(int)
 bottom\_right = corners2[2].ravel()

 # Display the newly computed coordinates of Tag 2 
 cv2.putText(
 frame,
 f"x:{round(Tvec\_id2\_ref\_id1[0],precision)} y: {round(Tvec\_id2\_ref\_id1[1],precision)} ",
 bottom\_right,
 cv2.FONT\_HERSHEY\_PLAIN,
 fontScale,
 (255, 0, 255),
 2,
 cv2.LINE\_AA,
 )

 # Sometimes ids is None and we get a Type error because of len(ids) but osef
 except TypeError as v:
 pass
 except Exception as e:
 rprint("[bold red] {} [/bold red]".format(e))
 pass

 # Display the frame
 cv2.imshow("Table", frame) 
 key = cv2.waitKey(1)
 
 # Close the frame is "q" is pressed
 if key == ord("q"):
 conn2.send(None)
 break

 # Finish the program cleanly
 cv2.destroyAllWindows()
 vs.stop()
이 파이썬 코드를 깔끔하게 재작성하고 이후 예제와 같은 함수로 작동하도록 합니다.다시 작성할 코드 : import osimport sys임포트 임뮤틸numpy를 np로 임포트sys.path.append(os.getcwd() + "/../") #팀에 의해 작성되었으므로 모든 것을 신경 쓰지 않습니다.import mainimport cv2#칼리\_1mtx = np.array([[1.19126136e+03, 0.00000000e+00, 9.59240007e+02], [0.00000000e+00, 1.11365936e+03, 5.27377810e+02], [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])dist = np.array([[ 0.11751622, -0.4181012, -0.0034592, 0.0087792, 0.33441168]]))#칼리\_2#mtx = np.array([[1.19309855e+03, 0.00000000e+00, 7.84314808e+02], [0.00000000e+00, 1.11766414e+03, 5.62846555e+02], [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]))#dist = np.array([[ 0.0091465, 0.15736172, -0.0010599, -0.00085758, -0.43462203]]))웹캠 = cv2.VideoCapture('trasnslation22s.video')#웹캠 = cv2.VideoCapture(0, cv2.CAP\_V4L)#이미지 = 웹캠.읽기()img = cv2.imread('1.jpeg')h, w = img.shape[:2]webcam.set(cv2.CAP\_PROP\_FRAME\_WIDTH, w)webcam.set(cv2.CAP\_PROP\_FRAME\_HEIGHT, h)newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))동안 True: check, frame = webcam.read() if check:  # 왜곡 해제 dst = cv2.undistort(frame, mtx, dist, None, newcameramtx) # 이미지 자르기 X, Y, W, H = ROI frame = dst[y:y+h, x:x+w]  frame = imutils.rotate(frame, 180) main.function(frame) frame = cv2.resize(frame, (860, 540)) cv2.imshow('video', frame)   key = cv2.waitKey(1) if key==27: breakwebcam.release()cv2.destroyAllWindows()예제 코드 :import cv2에서 툴킷을 가져옵니다.numpy를 np로 임포트pathlib에서 Path를 가져옵니다. imutils.video에서 WebcamVideoStream을 가져옵니다.imutils에서 회전 임포트리치에서 인쇄를 rprint로 가져옵니다.scipy.signal에서 savgol\_filter를 가져옵니다.def coord\_tag(dict,id1,id2,size1,size2,conn2=None,filter=False,src\_=0): # 캘리브레이션에 필요한 사이드 함수와 행렬을 로드합니다. tool = toolkit() cam\_mat = tool.mtx dist\_coef = tool.dist y1 = 70 # 사전 로드 marker\_dict = cv2.aruco.Dictionary\_get(tool.ARUCO\_DICT[dict]) # 사비츠키-골레이의 필터 매개변수 y\_raw\_value = [] window\_size = 11 sample\_size = 50 다항식\_order = 2 # 비디오 스트림 로드 vs = WebcamVideoStream(src=src\_).start() # 카메라의 매개변수 생성 param\_markers = cv2.aruco.DetectorParameters\_create() # 표시되는 텍스트 매개변수 fontScale = 1.5 정밀도 = 3 # 프로그램 루프  동안 True: # 프레임 읽기 frame = vs.read() # 이미지 회전 (중요하지 않음) frame =rotate(frame,180) # 프레임에 회색 필터 추가하기 gray\_frame = cv2.cvtColor(frame, cv2.COLOR\_BGR2GRAY) # 이미지의 태그 감지 모서리, ids, \_ = cv2.aruco.detectMarkers( GRAY\_FRAME,  marker\_dict, 매개 변수 = 매개 변수 \_ 마커 )  try: # 어떤 id에 대응할 rvec을 알기 위해 딕셔너리를 만듭니다. # ids 배열을 평평하게 만들어 봅시다. ids\_flat = [ ui[0] for ui in ids] # 사용하기 쉽도록 사전을 만듭니다.  ind\_id = { id: i for (i,id) in enumerate(ids\_flat) } # 아이디와 크기가 다른 마커에 대해 두 개의 별도 목록을 만듭니다. corners1 = corners[ind\_id[id1]] corners2 = corners[ind\_id[id2]]   # 지정한 2개의 태그가 감지되면 메인 프로그램으로 들어갑니다. if ([id1] in ids) 및 ([id2] in ids): # 마커의 포즈를 추정합니다. rvecs1, tvecs1, \_ = cv2.aruco.estimatePoseSingleMarkers( corners1, size1,  cam\_mat, dist\_coef) rvecs2, tvecs2, \_ = cv2.aruco.estimatePoseSingleMarkers( corners2, size2,  cam\_mat, dist\_coef) # 균질 행렬을 계산합니다.  일반적으로 여기서 노글리치가 발생할 수 있지만, 같은 아이디를 가진 # 참조 태그가 여러 개 있는 경우 주의하세요.  # 동일한 ID를 가진 참조 태그가 여러 개 있는 경우 주의하세요.   # 포즈 추정당 태그가 하나만 있으므로 인덱스 0을 사용합니다. H = tool.Homogeneous(rvecs1[0],tvecs1[0])  # tvec2를 동질로 전달 tv = np.array([ tvecs2[0][0][0], tvecs2[0][0][1], tvecs2[0][0][2], 1]) # 태그 1 좌표계에서 태그 2 좌표를 계산합니다. Tvec\_id2\_ref\_id1 = np.dot(tv,H) Tvec\_id2\_ref\_id1 = Tvec\_id2\_ref\_id1[0:3]/Tvec\_id2\_ref\_id1[3]  # 태그의 포즈 그리기 : 빨강 = 황소 | 초록 = 오이 | 파랑 = 오즈  frame = cv2.aruco.drawDetectedMarkers(프레임, 모서리, ids) frame = cv2.drawFrameAxes(frame, cam\_mat, dist\_coef, rvecs1, tvecs1, 0.1, 1) frame = cv2.drawFrameAxes(frame, cam\_mat, dist\_coef, rvecs2, tvecs2, 0.1, 1) # 태그 2의 오른쪽 하단 좌표를 추출하여 텍스트 플롯하기 corners2 = corners2[0].reshape(4,2) corners2 = corners2.astype(int) bottom\_right = corners2[2].ravel() # 태그 2의 새로 계산된 좌표를 표시합니다.  cv2.putText( frame, f"x:{round(Tvec\_id2\_ref\_id1[0],precision)} y: {round(Tvec\_id2\_ref\_id1[1],precision)} ", bottom\_right, cv2.FONT\_HERSHEY\_PLAIN, fontScale, (255, 0, 255), 2, cv2.LINE\_AA, ) # 때때로 ids가 None이고 len(ids) 때문에 Type 에러가 발생하는 경우가 있습니다. 를 TypeError로 제외합니다: 통과 예외를 e로 제외합니다: rprint("[굵은 빨강] {} [/붉은 빨강]".format