Python을 통해 결과를 계산하기

기능 설명

이 스텝에서는 Python을 통해 사용자 정의 스크립트를 실행하고 계산 결과를 Mech-Vision으로 출력할 수 있습니다.

이 스텝의 특징은 다음과 같습니다.

  • 멀티스레드 사용을 지원합니다.

  • Python 스크립트는 실시간으로 로드될 수 있습니다.

  • C++와 Python 간에 데이터를 전송할 때 여러 데이터 유형의 변환을 지원합니다.

  • Python 측에서 Mech-Vision으로 로그 리디렉션을 지원합니다.

응용 시나리오

사용자 정의 계산이 필요한 경우 사용자는 이 스텝을 사용하여 작성된 Python 스크립트를 실행하여 비전 솔루션을 단순화할 수 있습니다.

입력 및 출력

  • 입력: * *입력 포트 파라미터에 입력된 데이터 유형에 따라 결정됩니다. 포트 이름 바꾸기는 지원되지 않습니다.

  • 출력: * *출력 포트 파라미터에 입력된 데이터 유형에 따라 결정됩니다. 포트 이름 바꾸기는 지원되지 않습니다.

이번 스텝의 입출력 포트의 데이터 유형은 이전 스텝과 이후 스텝의 입출력 포트의 데이터 유형에 따라 결정될 수 있습니다.

설치 및 사용

설치 방법

Mech-Vision에는 Python 3.9.13이 내장되어 있으므로, 이 스텝에서는 소프트웨어의 내장 환경을 사용합니다. 사용 중에 Python 라이브러리가 누락된 경우 누락된 Python 라이브러리를 Mech-Vision에 내장된 Python 환경에 설치해야 합니다. 설치 방법은 다음과 같습니다.

  1. 명령 프롬프트를 엽니다.

  2. 명령줄에서 "cd" 명령을 사용하여 경로를 Mech-Vision의 Python 디렉터리로 전환합니다.

  3. python -m pip install Python 라이브러리 명령을 실행하여 해당 Python 라이브러리를 다운로드하여 설치합니다.

Mech-Vision에 일반적으로 사용되는 두 가지 Python 라이브러리인 NumPy와 OpenCV가 내장되어 있습니다.

사용 방법

Python 스크립트를 준비한 후 이 스텝을 다음과 같이 사용하십시오(각 파라미터에 대한 설명은 파라미터 설명 참조).

  1. 입력/출력 포트의 데이터 유형을 설정합니다. 이전 또는 이후 스텝의 입력/출력 포트의 데이터 유형에 따라 입력 포트출력 포트의 데이터 유형을 입력하십시오.

  2. Python 스크립트 경로를 설정합니다. 스크립트 파일 경로에서 로드할 스크립트의 경로를 선택합니다.

  3. 호출할 함수의 이름을 설정합니다. 스크립트 파일 경로가 지정되면 이 스텝에서는 스크립트의 함수 이름을 자동으로 검색하고 호출할 함수 이름의 드롭다운 목록에서 호출할 함수 이름을 선택할 수 있습니다.

  4. 스텝을 실행합니다.

  • Python 스크립트를 작성할 때 데이터를 얻기 위해 스크립트에 명령문을 작성하지 않고도 Mech-Vision 데이터를 처리하는 함수를 직접 작성할 수 있습니다. 스크립트의 구체적인 형식은 Python 예제 프로그램을 참조하십시오.

  • Python 스크립트가 변경될 때 이 스텝에서 최신 Python 스크립트를 실시간으로 실행하려면 스텝 파라미터의 실행 플래그에서 필요한 파일 다시 로드를 선택하면 됩니다. 이 옵션을 선택하면 스텝을 수행할 때 스크립트 파일 경로 파라미터에서 선택한 Python 스크립트만 다시 로드되고, 선택한 Python 파일에서 가져온 다른 Python 스크립트는 다시 로드되지 않습니다.

Mech-Vision 1.8.0부터 "Python을 통해 결과를 계산하기" 스텝의 실행 모드가 직렬에서 병렬로 변경됩니다(Python의 threading 모듈과 동일한 효과). 스크립트 내에서 병렬 실행을 지원하지 않는 카메라 API를 호출하는 경우(예: 카메라 열거) 해당 API 호출 위치에 잠금을 추가해야 합니다.

사용 시 주의사항

Python 스크립트를 작성하고 이 스텝에서 스크립트를 실행할 때 다음 문제에 주의하십시오.

타사 라이브러리 사용 권장

Mech-Vision에서 Python 스크립트를 실행하는 것은 Python 환경에서 스크립트를 직접 실행하는 것과 다르기 때문에 일부 Python 라이브러리는 성공적으로 설치되지 않거나 설치 후 제대로 작동하지 않을 수 있으므로 타사 라이브러리를 사용하는 것이 좋습니다.

NumPy 라이브러리 사용

NumPy 라이브러리는 일부 복잡한 형식의 데이터를 지원하는 데 사용됩니다. 파라미터 유형이 NumPy인데 NumPy를 가져오지 않은 경우 오류가 발생할 수 있습니다. 따라서 스크립트 시작 부분에 import numpy를 추가해야 합니다.

스크립트 작성 시 데이터 차원을 주의

Python 스크립트 작성 시 스텝의 각 포트에 해당하는 데이터의 차원을 참고하시기 바랍니다.

  • 디폴트 데이터 차원이 0: Image; Cloud(XYZ); Cloud(XYZ-Normal)

  • 디폴트 데이터 차원이 1: NumberList; BoolList; IndexList; StringList;Shape2DList

  • 디폴트 데이터 차원이 2: PoseList; Pose2DList; Size3DList

데이터 차원을 추가하려면 데이터 유형 뒤에 "[]"를 사용하십시오.

예를 들어 NumberList의 데이터 차원은 1이고 NumberList[]의 데이터 차원은 2입니다.

파라미터 설명

입력 포트

설명: 이 파라미터는 입력 포트의 데이터 유형을 지정하는 데 사용됩니다. 입력한 데이터 유형은 해당 순서에 따라 호출된 함수에 파라미터로 전달됩니다.

기본값: 비어 있음.

출력 포트

설명: 이 파라미터는 출력 포트의 데이터 유형을 지정하는 데 사용됩니다. 함수에서 반환된 데이터는 해당 순서대로 스텝에 반환되며 해당 데이터 유형에 따라 구문 분석됩니다.

기본값: 비어 있음.

현재 지원되는 데이터 유형은 다음과 같습니다.

스텝 포트 유형 Python에서 사용되는 데이터 유형 입력 데이터 예시

PoseList

리스트

[[10, 20, 30, 0.951, 0.255, 0.168, 0.045]], [10, 20, 30, 0.951, 0.255, 0.168, 0.045]]
(각 배열에서 처음 세 값은 좌표이고 다음 네 값은 사원수)

Pose2DList

리스트

[[0, 0, 0]], [2, 0, 120]]
(각 배열에서 처음 두 값은 각각 좌표의 X, Y 값이고 세 번째 값은 각도)

NumberList

리스트

[1.1, 2, 999.9, -22]

Shape2DList

리스트

['{"theta": 0,"x": 988.89129638671875,"y": 422.89129638671875}', '{"theta": 0,"x": 988.89129638671875,"y": 422.89129638671875}']

StringList

문자열

['string_1', 'string_2', 'string_3']

Image

8비트 부호 없는 정수/64비트 부동 소수점 숫자

데이터 경로

Cloud(XYZ)

배열(Array)

포인트 클라우드 데이터

Cloud(XYZ-Normal)

배열(Array)

법선 방향이 있는 포인트 클라우드 데이터

Cloud(XYZ-RGB)

배열(Array)

컬러 포인트 클라우드 데이터

Size3DList

64비트 부동 소수점 숫자

[[2.5, 5, 0.001]], [6, 5, 0.02]]
(각 배열에서 처음 두 값은 너비와 높이이고 세 번째 값은 각 픽셀의 길이)

IndexList

정수

[45, 10, 90]

BoolList

부울

[True, False, True]

스크립트 파일 경로

설명: 이 파라미터는 로드할 스크립트의 파일 경로를 선택하는 데 사용됩니다.

기본값: 비어 있음.

호출되는 함수 이름

파라미터 설명: 이 파라미터는 호출할 스크립트 함수의 이름을 설정하는 데 사용됩니다.

기본값: 비어 있음.

Python 예제 프로그램

이 스텝의 학습 및 활용을 쉽게 하기 위해 다음 부분에서는 스텝 포트 유형에 익숙해지는 데 도움이 되는 일부 Python 프로그램을 제공합니다.

퀵 가이드

Python 스크립트를 사용하여 한 가지 유형의 데이터 출력

한 가지 형태의 데이터를 출력하는 함수는 아래에 정의되어 있습니다. “Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 스텝에서 이 함수를 호출하십시오.

def get_doublelist():
    return [1.1,22,3.3]

이 기능에 해당하는 Mech-Vision 프로젝트는 아래와 같습니다. 출력 포트에 해당하는 데이터 스트림을 더블클릭하면 출력 결과를 확인할 수 있습니다.

calc results by python single output project

Python 스크립트를 사용하여 여러 유형의 데이터 출력

여러 유형의 데이터를 출력하는 함수는 아래 프로그램에 정의되어 있습니다. “Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 스텝에서 이 함수를 호출하십시오.

def example_of_basic_portTypes():
    numList = [1.1, 2, 999.9, -22]
    indexList = [45, 10, 90]
    boolList = [True, False, True]
    strList = ['string_1', 'string_2', 'string_3']
    poseList = [[10, 20, 30, 0.951, 0.255, 0.168, 0.045], [10, 20, 30, 0.951, 0.255, 0.168, 0.045]]
    pose2dList = [[0, 0, 0], [2, 0, 0.785]]
    size3dList = [[2.5, 5, 0.001], [6, 5, 0.02]]
    return numList, indexList, boolList, strList, poseList, pose2dList, size3dList

이 기능에 해당하는 Mech-Vision 프로젝트는 아래와 같습니다. 출력 포트에 해당하는 데이터 스트림을 더블클릭하면 출력 결과를 확인할 수 있습니다.

calc results by python multi output project

두 가지 "Python을 통해 결과를 계산하기” 스텝으로 데이터를 처리

숫자 값 목록을 출력하는 함수는 프로그램 1에 정의되어 있습니다. 각 숫자 목록 내의 값의 합을 계산하는 함수는 프로그램 2에 정의되어 있습니다.

“Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 이 스텝에서 다음 프로그램을 호출하고 스텝을 연결하여 입력한 숫자 목록에 대해 총 연산을 수행 할 수 있습니다.

프로그램 1:

def get_numberlist_1():
    return [[1, 2, 3],[4,5,6]]

프로그램 2:

def cal_number_list(nums_list):
    sums = [align="center"]
    for nums in nums_list:
        sum = 0
        for num in nums:
            sum += num
        sums.append(sum)
    return [sums]

이 기능에 해당하는 Mech-Vision 프로젝트는 아래와 같습니다. 출력 포트에 해당하는 데이터 스트림을 더블클릭하면 출력 결과를 확인할 수 있습니다.

calc results by python single sum output project

여러 "Python을 통해 결과를 계산하기” 스텝으로 데이터를 처리

프로그램 1에서는 수치 리스트를 출력하는 함수를 정의하고, 프로그램 2에서는 부울 리스트를 출력하는 함수를 정의합니다. 프로그램 3에서는 수치에 “9999” 값을 더하고 “False”를 출력합니다. 그 다음 부울 목록에 추가되고 새로운 숫자 값 목록과 부울 목록이 출력됩니다.

“Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 이 스텝에서 다음 프로그램을 호출하여 여러 입력 데이터에 대해 처리 할 수 있습니다.

프로그램 1:

def get_doublelist():
    return [1.1,22,3.3]

프로그램 2:

def get_bool_list():
    return [[True,False],[True,True],[False,False]]

프로그램 3:

def print_multi_values(numberList, boolList):
	numberList.append(9999)
	boolList.append(False)
	return numberList, boolList

이 기능에 해당하는 Mech-Vision 프로젝트는 아래와 같습니다. 출력 포트에 해당하는 데이터 스트림을 더블클릭하면 출력 결과를 확인할 수 있습니다.

calc results by python multi output process project

실제 응용

프로젝트 실행 중 생성된 이상 데이터 저장

실제 응용에서는 프로젝트에 다양한 오류가 발생할 수 있습니다. Mech-Vision의 데이터 저장 기능과 함께 사용자 정의 Python 스크립트를 사용하여 문제 해결을 위해 비정상적인 데이터를 저장할 수 있으므로 비전 시스템의 안정성이 향상됩니다.

구체적인 작업은 다음과 같습니다.

  1. 데이터 저장 기능 활성화

    Mech-Vision 프로젝트 지원에서 데이터 및 파라미터 저장을 활성화합니다. 프로젝트 실행 시 오류가 발생하면 원시 데이터는 프로젝트 폴더/data/error_data에 저장됩니다.

  2. Python 스크립트 작성

    “3D 매칭” 과정을 통해 출력된 포즈 결과가 null인지 판단하는 Python 예제 프로그램은 다음과 같습니다.

    def abnormal_output_detection(outputs):
        if len(outputs) == 0:
            raise Exception("NO RESULT!!!")
        else:
            pass
  3. “Python을 통해 결과를 계산하기” 스텝의 사용 방법을 참조하여 “Python을 통해 결과를 계산하기”여 스텝에서 위의 프로그램을 호출하여 이 스텝을 “3D 매칭” 다음에 연결해주십시오.

    프로젝트 실행 후 “3D 매칭”으로 출력된 포즈 결과가 null인 경우 에러 메시지가 뜨며, 비정상적인 데이터는 프로젝트 폴더/data/error_data 폴더에 저장됩니다.

입력한 포인트 클라우드의 Z 값을 기반으로 의사 컬러 포인트 클라우드 생성

출력한 포인트 클라우드에 텍스처 정보가 없는 경우 사용자 정의 Python 스크립트를 사용하여 입력 포인트 클라우드의 Z 값을 기반으로 의사 컬러 포인트 클라우드를 생성하여 출력을 더 잘 시각화할 수 있습니다.

처리 과정은 다음과 같이 요약될 수 있습니다.
먼저 Z 값은 0에서 255 사이의 값으로 매핑되어 그레이스케일 값을 얻습니다. 그런 다음 OpenCV를 사용하여 그레이스케일 값을 RGB 값으로 매핑하므로 의사 컬러 포인트 클라우드가 생성될 수 있습니다.

Python 예제 프로그램은 다음과 같습니다.

import math

import cv2
import numpy as np

def generate_color_point_could_by_depth(point_cloud):
    x = point_cloud[:, 0]
    y = point_cloud[:, 1]
    z = point_cloud[:, 2]

    z_min = np.min(z)
    z_max = np.max(z)

    if math.isclose(z_max - z_min, 0):
        return np.column_stack((x, y, z, np.full(z.shape, 0xFFFFFFFF, np.uint32).view(np.float32)))

    color = 255 * (z - z_min) / (z_max - z_min)
    color = cv2.applyColorMap(color.astype(np.uint8), cv2.COLORMAP_JET)

    color = np.squeeze(color).astype(np.uint32)
    color = (0xFF000000 | (color[:, 0] << 16) | (color[:, 1] << 8) | color[:, 2]).view(np.float32)

    return np.column_stack((x, y, z, color))

저희는 귀하의 개인 정보를 소중하게 생각합니다.

당사 웹사이트는 귀하에게 최상의 경험을 제공하기 위해 쿠키를 사용합니다. "모두 수락"을 클릭하시는 경우, 귀하는 사의 쿠키 사용에 동의하게 됩니다. "모두 거부"를 클릭하시는 경우, 귀하가 이 웹사이트를 방문할 때 추적되거나 기억되지 않도록 하기 위해 단일 쿠키가 사용됩니다.