Power Automate Desktop에서 OpenCV를 사용할 때 고려할 사항

개요


Power Automate Desktop(이하 PAD)을 사용하여 GCP의 Text Detection을 진행한 후 파이톤의 OpenCV에서 이미지의 텍스트를 모자이크 처리했다.
그때 주의사항이야.

번호가 모자이크로 처리되었다.

전제 조건


Windows10pro 20H2
Power Automate Desktop 2.2.20339.22608.
GCP Vison API
Python 3.8.5
pandas 1.1.4
numpy 1.18.5
opencv-python 4.4.0.46
.py 파일 실행 가능
릴리즈https://www.python.org/를 사용하는 설치 프로그램이 아닙니다.
라이브러리는 별도로 설치됨
2020년 12월 메시지다.

주의 사항


PAD의 Pythhon2는 동작으로 사용할 수 있지만 OpenCV 등 라이브러리의 삽입이 불분명하기 때문에 자신의 환경 Python을 호출하는 방법을 사용했다.
이전뉴스.에 소개된 바와 같이 WinAutomation은 Write Text를 사용하여 코드를 생성하고 임의의 Pythn을 사용할 수 있다.
하지만 PAD에서 같은 방법을 사용하려면 제한이 있다.
같은 방법을 취했지만 제한이 있는 이상 현시점에서 공식적으로 지지받는 방법은 아니다.

프로세스 이미지



프로세스 작성


바탕 화면에 "Landscape""LMOut"폴더 두 개를 만듭니다.

네 번째 행의 텍스트 체크 동작에 API 키를 추가합니다.
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolder
Folder.GetFiles Folder: $'''%SpecialFolder%\\Landscape''' FileFilter: $'''*.jpg''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
LOOP FOREACH CurrentItem IN Files
    Cognitive.Google.Vision.TextDetectionFromFile APIKey: $'''''' ImageFile: CurrentItem Timeout: 30 Response=> JSONResponse StatusCode=> StatusCode
    File.WriteText File: $'''%SpecialFolder%/Landscape/%CurrentItem.NameWithoutExtension%.json''' TextToWrite: JSONResponse AppendNewLine: False IfFileExists: File.IfFileExists.Overwrite Encoding: File.FileEncoding.UTF8NoBOM
    File.WriteText File: $'''%SpecialFolder%/Landscape/%CurrentItem.NameWithoutExtension%.py''' TextToWrite: $'''aaaaaaaa''' AppendNewLine: False IfFileExists: File.IfFileExists.Overwrite Encoding: File.FileEncoding.UTF8
    System.RunDOSCommand DOSCommandOrApplication: $'''%SpecialFolder%/Landscape/%CurrentItem.NameWithoutExtension%.py''' WorkingDirectory: $'''%SpecialFolder%/Landscape''' StandardOutput=> CommandOutput StandardError=> CommandErrorOutput ExitCode=> CommandExitCode
    File.Delete Files: $'''%SpecialFolder%/Landscape/%CurrentItem.NameWithoutExtension%.py'''
    File.Delete Files: $'''%SpecialFolder%/Landscape/%CurrentItem.NameWithoutExtension%.json'''
    File.Move Files: CurrentItem Destination: $'''%SpecialFolder%\\LMOut''' IfFileExists: File.IfExists.Overwrite MovedFiles=> MovedFiles
END

Python 코드 삽입


다음은 이번 주제입니다.
그림의 전체 흐름에 6줄에 Python 코드가 들어갔지만 상기 코드에는 억지로 aaaaaa를 사용해야 한다.

aaaaaaaaaaa에서 python 코드를 쓰면 문제없지만, PAD에서 '쓴 텍스트' 표시줄에서 줄을 바꿀 수 없습니다.
왜 '쓴 텍스트' 를 사용합니까? 이 동작에서python 코드를 생성하면 PAD 측의 변수가 Python에 전달될 수 있기 때문입니다.
다행히 PAD는 RPA 언어의 Robin을 기반으로 실행됩니다.
PAD의 동작은 시각적으로 블록화되어 사용자가 명확하게 나타낼 수 있지만 실제로는 위의 코드처럼 문자를 바탕으로 한다.
따라서 편집기에 '쓴 텍스트' 를 붙이면 단순한 텍스트로 처리할 수 있다.
그리고 aaaaaaaaaaaaaaaa 부분에 파이썬 코드를 붙여서 PAD에 다시 붙여넣으면 '쓴 텍스트' 동작에 파이썬 코드를 저장할 수 있습니다.

aaaaaaaaa 섹션의 Pythn 코드
# ライブラリ読み込み
import json
import pandas as pd
import numpy as np
import cv2

# JSON読み込み
with open("%CurrentItem.NameWithoutExtension%.json", "r", encoding="utf-8") as content:
    data = json.loads(content.read())

# 画像の読み込み
img = cv2.imread("%CurrentItem.Name%")
xmax = img.shape[1]
ymax = img.shape[0]

# モザイク定義

def mosaic(img, rect, size):
    # モザイクをかける領域を取得
    (x01, y01, x02, y02) = rect
    w = x02-x01
    h = y02-y01
    i_rect = img[y01:y02, x01:x02]
    # 一度縮小して拡大する
    i_small = cv2.resize(i_rect, (size, size))
    i_mos = cv2.resize(i_small, (w, h), interpolation=cv2.INTER_AREA)
    # モザイクに画像を重ねる
    img2 = img.copy()
    img2[y01:y02, x01:x02] = i_mos
    return img2


# 座標抜出およびモザイク処理
for c in range(1, len(data["responses"][0]["textAnnotations"])):
    pointdata = data["responses"][0]["textAnnotations"][c]["boundingPoly"]["vertices"]
    df_target = pd.read_json(json.dumps(pointdata))

    x0 = int(df_target.fillna(0).iat[0, 0])
    x1 = int(df_target.fillna(xmax).iat[1, 0])
    x2 = int(df_target.fillna(xmax).iat[2, 0])
    x3 = int(df_target.fillna(0).iat[3, 0])

    xlist = np.array([x0, x1, x2, x3])
    xp1 = np.min(xlist)
    xp2 = np.max(xlist)

    y0 = int(df_target.fillna(0).iat[0, 1])
    y1 = int(df_target.fillna(0).iat[1, 1])
    y2 = int(df_target.fillna(ymax).iat[2, 1])
    y3 = int(df_target.fillna(ymax).iat[3, 1])

    ylist = np.array([y0, y1, y2, y3])
    yp1 = np.min(ylist)
    yp2 = np.max(ylist)

    pointlist = np.array([xp1, yp1, xp2, yp2])

    img = mosaic(img, pointlist, 5)
# 画像保存
cv2.imwrite("/Users/Username/Desktop/LMOut/%CurrentItem.NameWithoutExtension%_masked.jpg", img)
위 코드 정보
VisionAPI에서 반환된 JSON에서 읽은 문자의 위치 정보를 추출하여 모자이크 처리합니다.
판다스에 놓인 이유는 텍스트가 이미지를 초과하면 VisionAPI가 반환하는 위치 정보가 부족하기 때문에 0 또는 이미지 최대치로 채우려고 합니다.

주의점


PAD의 변수로% 괄호 문자를 처리합니다.
가장 중요한 것은 로빈 언어에서'단식'은 이미 문자의 한 구성 부분으로 의미가 있기 때문에 파이톤 코드에서 문자의 모든 범위는'더블 따옴표'이다.
\백슬래시는 Robin 언어에서 도피 문자이므로 주의해야 합니다.
\%도피할 수 없습니다.

총결산

  • 2020년 12월까지'텍스트를 파일에 쓰기'의 여러 줄 동작을 사용할 수 없습니다.
  • 추측일 뿐이지만'단식 따옴표와 로빈 언어가 함께 쓰이면 움직이지 않기 때문에 제한된다.
  • Robin 언어에 대해서는 여기.를 참조하십시오.
  • Winautomation 파일을 끌어다 놓으면 즉시 강력한 성능을 발휘할 수 있습니다.PAD도 Power Automate의 파일을 사용하여 트리거할 수 있지만 이번과 같은 절차는 아니라고 생각합니다.
  • 파이썬 환경을 만들어야 하는 절차는 실제 작업에서 어려울 수 있지만 팻말이 있는 것이 좋다고 생각해서 이 글을 썼습니다.
  • 필요 없는 재료지만 올해 2일 앞으로 대청소를 하고 수출할 예정이다.
  • 좋은 웹페이지 즐겨찾기