keep-loving-pythonのブログ

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

解決策。TypeError: cannot unpack non-iterable numpy.int32 object。opencvのcv2.detail.leaveBiggestComponent関連。

解決策。TypeError: cannot unpack non-iterable numpy.int32 object。opencvのcv2.detail.leaveBiggestComponent関連。

エラー

TypeError: cannot unpack non-iterable numpy.int32 object

詳細

Traceback (most recent call last):
  File "panorama.py", line 84, in <module>
    conn_images, features, p = largest_connected_subset(all_images)
  File "panorama.py", line 38, in largest_connected_subset
    conn_indices = [i for [i] in _conn_indices]
  File "panorama.py", line 38, in <listcomp>
    conn_indices = [i for [i] in _conn_indices]
TypeError: cannot unpack non-iterable numpy.int32 object

環境

windows10
python3.7
opencv-python 4.6.0

エラーにあったコード

https://github.com/PacktPublishing/OpenCV-4-with-Python-Blueprints-Second-Edition

解決策

結論

これは、opencv-pythonが4.6.0で、cv2.detail.leaveBiggestComponentのリターンの形が少しだけ変わったからです。

具体的な情報

4.5.3のstitching_detailed.py

    indices = cv.detail.leaveBiggestComponent(features, p, conf_thresh)
    img_subset = []
    img_names_subset = []
    full_img_sizes_subset = []
    for i in range(len(indices)):
        img_names_subset.append(img_names[indices[i, 0]])
        img_subset.append(images[indices[i, 0]])
        full_img_sizes_subset.append(full_img_sizes[indices[i, 0]])
    images = img_subset

4.6.0のstitching_detailed.py

    indices = cv.detail.leaveBiggestComponent(features, p, conf_thresh)
    img_subset = []
    img_names_subset = []
    full_img_sizes_subset = []
    for i in range(len(indices)):
        img_names_subset.append(img_names[indices[i]])
        img_subset.append(images[indices[i]])
        full_img_sizes_subset.append(full_img_sizes[indices[i]])
    images = img_subset

ですから
↑ を参考に、ソースを修正して下さい。

コメント

時間があるときに、もう少し、整理したいと思いますが。。。。

OpenCVによる撮影画像の連結をいろいろ試してみる【4】

OpenCVによる撮影画像の連結をいろいろ試してみる【4】

基本は、GitHub等のコードを動かすだけ。

OpenCV-4-with-Python-Blueprints-Second-Edition

これも、比較的シンプルなもの

環境

windows10
python3.7
opencv-python 4.5.3.56

URL

https://github.com/PacktPublishing/OpenCV-4-with-Python-Blueprints-Second-Edition

これのchapter5

結果

下準備

SURF動かないので、ORBへ

    ##finder = cv2.xfeatures2d_SURF.create()
    finder = cv2.ORB.create()

結果

まず、大失敗の例です。これは、⇒ORBに変更したのに、パラメータ(閾値)を変更していないせいです。 別途、詳細示します。。。

こっちは、セーフの例です。

解決策。AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d_SURF'

解決策。AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d_SURF'

エラーの内容

エラー

AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d_SURF'

エラーの全体

Traceback (most recent call last):
  File "panorama.py", line 76, in <module>
    conn_images, features, p = largest_connected_subset(all_images)
  File "panorama.py", line 22, in largest_connected_subset
    finder = cv2.xfeatures2d_SURF.create()
AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d_SURF'

環境

windows10
python3.7
opencv_python 4.5.3

解決策

解決策1

特許等の関係で、SURFに対応できていません。
よって、 xfeatures2d_SURFを別の仕組みであるORB等に書き換えれば動きます。

    ##finder = cv2.xfeatures2d_SURF.create()
    finder = cv2.ORB.create()

解決策2

opencv_pythonopencv-contrib-pythonとかに替えると動いたような記憶あり。

コメント

不明点等あれば、コメント下さい。わかれば回答します。

解決策。cv2.error: OpenCV(4.5.3) :-1: error: (-5:Bad argument) in function 'drawMarker'

cv2.error: OpenCV(4.5.3) :-1: error: (-5:Bad argument) in function 'drawMarker'

エラー

エラーの内容

cv2.error: OpenCV(4.5.3) :-1: error: (-5:Bad argument) in function 'drawMarker'

エラー全体

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

環境

windows10
python3.7
opencv4.5.3

解決策

入力するデータをfloatからintにする

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

コードを示せないと状況が見えないと思いますが。。。コードは、以下。↓

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

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

img_mark = img.copy()

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

コメント

特にありませんが。。。OpenCVのエラー、きりがないので、エラーの味方の整理を、いつか、したいと思います。

【重要!】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)

コメント

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

【重要!】Python OpenCV のメソッドの仕様の調べ方

Python OpenCV のメソッドの仕様の調べ方

これ、重要です。見失うと悶絶します(先ほど、しました!)
だから、安全のために、記事に。

調べ方

import cv2
import inspect

print(inspect.getdoc(cv2.drawMarker))

結果の表示は、

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]

これは、単なるパクり記事というか。。。

以下の記事の末尾のほうで示されているのを見つけました。
(記事を書かれた人より、その記事を見つけた自分の偉大さに感動!)

qiita.com

コメント

お友達にも、展開下さい。
そうすると、自分が忘れたときに、聞けます!!!

OpenCVによる撮影画像の連結をいろいろ試してみる【3】

OpenCVによる撮影画像の連結をいろいろ試してみる【3】

基本は、GitHub等のコードを動かすだけ。

ORB feature based image stitching for UAV images

これも、比較的シンプルなもの

環境

windows10 python3.7

↓ pip

opencv-contrib-python             4.6.0.66

URL

https://github.com/sachin-vs/UAV-Image-stitching

結果

結果の補足

短時間で結果が出た。
画像サイズは、1587x2207とか

自分の関連記事

keep-loving-python.hatenablog.com

keep-loving-python.hatenablog.com