keep-loving-pythonのブログ

Pythonを愛し続けたいです(Pythonが流行っている限りですが。。。)

【重要!】Python OpenCV のメソッドの仕様の調べ方 (実演編!)

Python OpenCV のメソッドの仕様の調べ方 (実演編!)

以下の記事の実演編です。

keep-loving-python.hatenablog.com

実演

以下のようなコードを動かしてみます。 画像にマーカを書くコードです。

図形にマーカを書くコードとして、参考にしたのは、コード内のメモのとおり、

# https://note.nkmk.me/python-opencv-warp-affine-perspective/ wo mita

です。

# https://note.nkmk.me/python-opencv-warp-affine-perspective/ wo mita

import cv2
import numpy as np
import math

import inspect ##



img = cv2.imread('lena.jpg')

src_pts = np.array([[30, 30], [50, 200], [350, 50]], dtype=np.float32)##int32)##float32)

img_mark = img.copy()

print(cv2.__version__)
print(inspect.getdoc(cv2.drawMarker))##

for pt in src_pts:
    cv2.drawMarker(img_mark, tuple(pt), (0, 255, 0), thickness=4)

cv2.imwrite('out_yoon.jpg', img_mark)

さて、このコードは、ver4.0.1では、問題なく動作します。しかし、ver4.5.3では、エラーで失敗します。
さあ、皆の衆、お立ちあい
このコードは、APIの仕様が表示されます!!!
エラーが怖くありません。

4.0.1のとき

4.0.1
drawMarker(img, position, color[, markerType[, markerSize[, thickness[, line_type]]]]) -> img
.   @brief Draws a marker on a predefined position in an image.
.
.   The function cv::drawMarker draws a marker on a given position in the image. For the moment several
.   marker types are supported, see #MarkerTypes for more information.
.
.   @param img Image.
.   @param position The point where the crosshair is positioned.
.   @param color Line color.
.   @param markerType The specific type of marker you want to use, see #MarkerTypes
.   @param thickness Line thickness.
.   @param line_type Type of the line, See #LineTypes
.   @param markerSize The length of the marker axis [default = 20 pixels]

さて、4.5.3で、どうかわっているか!!!

4.5.3
drawMarker(img, position, color[, markerType[, markerSize[, thickness[, line_type]]]]) -> img
.   @brief Draws a marker on a predefined position in an image.
.
.   The function cv::drawMarker draws a marker on a given position in the image. For the moment several
.   marker types are supported, see #MarkerTypes for more information.
.
.   @param img Image.
.   @param position The point where the crosshair is positioned.
.   @param color Line color.
.   @param markerType The specific type of marker you want to use, see #MarkerTypes
.   @param thickness Line thickness.
.   @param line_type Type of the line, See #LineTypes
.   @param markerSize The length of the marker axis [default = 20 pixels]

がーーーーん 表示の範囲では同じでした。

エラーの内容

Traceback (most recent call last):
  File "opencv_api_ex001.py", line 21, in <module>
    cv2.drawMarker(img_mark, tuple(pt), (0, 255, 0), thickness=4)
cv2.error: OpenCV(4.5.3) :-1: error: (-5:Bad argument) in function 'drawMarker'
> Overload resolution failed:
>  - Can't parse 'position'. Sequence item with index 0 has a wrong type
>  - Can't parse 'position'. Sequence item with index 0 has a wrong type

オチ

この表示されるAPI仕様より細かいレベルでの変更のようです。

下記にて、float32--> int32 で解決します。

src_pts = np.array([[30, 30], [50, 200], [350, 50]], dtype=np.float32)##int32)##float32)

コメント

(今回は、敗れましたが。。。。!!)
さて、旅にでるか。。。