質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Python 3.x

    5873questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • OpenCV

    1018questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

なぜエラーが出るのかわからない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 215

DynMat

score 4

以下のコードを打つと次のようなエラーが出ます。なぜでしょうか。

File "detecter.py", line 80, in <module>
detect(img)
File "detecter.py", line 23, in detect
frame[(hypot - rows) * 0.5:(hypot + rows) * 0.5, (hypot - cols) * 0.5:(hypot + cols) * 0.5] = gray
TypeError: slice indices must be integers or None or have an index method

import cv2
import numpy as np
import math
from math import sin, cos
from os import path

cascades_dir = path.normpath(path.join(cv2.__file__, '..', '..', '..', '..', 'share', 'OpenCV', 'haarcascades'))
max_size = 720

def detect(img):
    cascade_f = cv2.CascadeClassifier(path.join(cascades_dir, 'haarcascade_frontalface_alt2.xml'))
    cascade_e = cv2.CascadeClassifier(path.join(cascades_dir, 'haarcascade_eye.xml'))
    # resize if learch image
    rows, cols, _ = img.shape
    if max(rows, cols) > max_size:
        l = max(rows, cols)
        img = cv2.resize(img, (cols * max_size / l, rows * max_size / l))
    rows, cols, _ = img.shape
    # create gray image for rotate
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    hypot = int(math.ceil(math.hypot(rows, cols)))
    frame = np.zeros((hypot, hypot), np.uint8)
    frame[(hypot - rows) * 0.5:(hypot + rows) * 0.5, (hypot - cols) * 0.5:(hypot + cols) * 0.5] = gray

    def translate(coord, deg):
        x, y = coord
        rad = math.radians(deg)
        return {
            'x': (  cos(rad) * x + sin(rad) * y - hypot * 0.5 * cos(rad) - hypot * 0.5 * sin(rad) + hypot * 0.5 - (hypot - cols) * 0.5) / float(cols) * 100.0,
            'y': (- sin(rad) * x + cos(rad) * y + hypot * 0.5 * sin(rad) - hypot * 0.5 * cos(rad) + hypot * 0.5 - (hypot - rows) * 0.5) / float(rows) * 100.0,
        }
    # rotate and detect faces
    results = []
    for deg in range(-48, 49, 6):
        M = cv2.getRotationMatrix2D((hypot * 0.5, hypot * 0.5), deg, 1.0)
        rotated = cv2.warpAffine(frame, M, (hypot, hypot))
        faces = cascade_f.detectMultiScale(rotated, 1.08, 2)
        print (deg, len(faces))
        for face in faces:
            x, y, w, h = face
            # eyes in face?
            y_offset = int(h * 0.1)
            roi = rotated[y + y_offset: y + h, x: x + w]
            eyes = cascade_e.detectMultiScale(roi, 1.05)
            eyes = filter(lambda e: (e[0] > w / 2 or e[0] + e[2] < w / 2) and e[1] + e[3] < h / 2, eyes)
            if len(eyes) == 2 and abs(eyes[0][0] - eyes[1][0]) > w / 4:
                score = math.atan2(abs(eyes[1][1] - eyes[0][1]), abs(eyes[1][0] - eyes[0][0]))
                if eyes[0][1] == eyes[1][1]:
                    score = 0.0
                results.append({
                    'center': translate([x + w * 0.5, y + h * 0.5], -deg),
                    'w': float(w) / float(cols) * 100.0,
                    'h': float(h) / float(rows) * 100.0,
                    'eyes': [translate([x + e[0] + e[2] * 0.5, y + y_offset + e[1] + e[3] * 0.5], -deg) for e in eyes],
                    'score': score,
                })
    # unify duplicate faces
    faces = []
    for result in results:
        x, y = result['center']['x'], result['center']['y']
        exists = False
        for i in range(len(faces)):
            face = faces[i]
            if (face['center']['x'] - face['w'] * 0.5 < x < face['center']['x'] + face['w'] * 0.5 and
                face['center']['y'] - face['h'] * 0.5 < y < face['center']['y'] + face['h'] * 0.5):
                exists = True
                if result['score'] < face['score']:
                    faces[i] = result
                    break
        if not exists:
            faces.append(result)
    for face in faces:
        del face['score']
    return faces

filename = 'nogi1.jpeg'
# 画像ファイルパスから読み込み
img = cv2.imread(filename)

detect(img)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/04/22 11:38

    どこでエラーが出ているかわからないと理由を考えるのが大変なので、エラーメッセージは省略せずすべて貼ってください

    キャンセル

  • DynMat

    2018/04/22 11:43

    すいません。うっかりしておりました。追記しました。

    キャンセル

回答 1

checkベストアンサー

+1

とりあえず思いつく原因は、* 0.5するとぜんぶfloatになるので、そのせいでslice indicesとして不適切になっているというものです。
ぜんぶint((hypot - rows) * 0.5)等のようにintでくくって型変換してあげれば、それだけは改善するでしょう。他に問題があるかどうかまでは見ていません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/22 11:58 編集

    回答ありがとうございます。この問題となっていたエラーは解決できました。
    File "detecter.py", line 23
    frame[int((hypot - rows) * 0.5:(hypot + rows) * 0.5, (hypot - cols) * 0.5:(hypot + cols) * 0.5)] = gray

    SyntaxError: invalid syntax

    と出てしまいました。
    frame[int((hypot - rows) * 0.5:(hypot + rows)...の:の部分に^が付いています。

    キャンセル

  • 2018/04/22 12:00

    すみません、私の説明が悪かったです。インデックスの値を一つずつ型変換してください
    frame[int((hypot - rows) * 0.5):int((hypot + rows) * 0.5), int((hypot - cols) * 0.5):int((hypot + cols) * 0.5)] = gray

    キャンセル

  • 2018/04/22 13:48

    hypot, rows, colsが全てintなら(hypot - rows) * 0.5の代わりに(hypot - rows) // 2とすればいい気もします。2重のスラッシュは型が保たれる割り算の演算子です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    java 記号文字のエスケープ処理について

    前提・実現したいこと javaで禁則文字チェックを作成しています。 禁則文字はプロパティで保持し、javaで取得した際にエスケープが必要な文字が含まれていた場合は その文

  • 解決済

    Javascriptが動いてくれません、、、

    Chart.jsというライブラリを使用しており、下記のJavascriptをHTMLの中に埋め込んでいるのですが、動いてくれません。 もし、Javascriptの書き方に欠陥等が

  • 解決済

    glassfishからDerbyに接続したい

    前提・実現したいこと derbyへの接続ができずに困っています。 会社から本サイトへ投稿することができないため、恐れ入りますが、返答、バージョンの確認、ソースの開示等、タイムラ

  • 解決済

    緯度経度を使った、二点間の距離を出したい

    緯度経度を使った、二点間の距離を出す unityでGPSを利用したアプリを作成しています。距離の計算式を書き、実行したところ実際の距離と全くかけ離れたものになってしまいました。

  • 解決済

    直線の描き方

    ある線に対してある角度の線を引きたい場合どのようにすればいいのでしょうか? 例えば g.drawLine(100, 100, 200, 200); 点(100, 100)

  • 解決済

    enchant.jsで、スプライトを向いてる方向に進ませる方法?

    enchant.jsにて、 Unityでいうところのtranform.forward、 Spriteが、Spriteの向いている方向に一定距離移動するようなコードの書き方を教え

  • 受付中

    javascriptで時計の枠のメモリの表示の仕方を教えてください。お願いします

    javascriptdeでcanvasに 時計を表示したいのですが5分おきに少し長いメモリを追加したのですがどうすればいいのでしょうか。 時針、分針、秒針はできてます。下がHTML

  • 解決済

    OpenCVを使った笑顔検出での問題

    前提・実現したいこと OpenCVで元からあるサンプルコード「smiledetect.cpp」を用いて笑顔検出のシステムを作っています。 検出機能を実装中に以下の問題が発生しました

同じタグがついた質問を見る

  • Python 3.x

    5873questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • OpenCV

    1018questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。