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

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

ただいまの
回答率

91.26%

  • Python

    4191questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    2747questions

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

  • OpenCV

    670questions

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

画像から指先だけを描画したい

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 83

uni_tt

score 4

前提・実現したいこと

手の画像の指先のみを処理(色を変えたり、ぼかしたり)できるプログラムを作成中です。その過程で編集したい範囲を決めるために指先のみが描画されている画像を作ろうとしています。

質問したいこと

1.指先のみを抽出するためのプログラムをどのように作れば良いかわかりません。1枚目の画像から2枚目のような指先のみが描画されている画像を作りたいです。現在は3枚目のような画像まで作れています。

2.現在私が考えている方法より簡単に指先のみを処理可能な方法があれば教えて頂きたいです。
よろしくお願いします。
イメージ説明
イメージ説明
イメージ説明

該当のソースコード

#1枚目の画像を作るプログラム
import cv2
import numpy as np
import sys

#肌色領域のみを抽出
def mask(param):
    img = cv2.imread("%s"%param[1])
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lower = np.array([0, 30, 160])
    upper = np.array([30, 150, 255])
    img_mask = cv2.inRange(hsv, lower, upper)

    img_color = cv2.bitwise_and(img, img, mask=img_mask)
    cv2.imwrite("color.jpg", img_color)
    return img_color

#最大面積を抽出することでノイズを除去
def labelling(im):
    height, width = im.shape[:2]
    kernel = np.ones((10,10),np.uint8)

    #最大面積のみを白にする
    gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    label = cv2.connectedComponentsWithStats(gray)

    data = np.delete(label[2], 0, 0)
    max_index = np.argsort(data[:,4])[::-1][0] + 1
    dst = label[1].reshape((-1))

    for index in range(len(dst)):
        if dst[index] == max_index:
            dst[index] = 255;
        else:
            dst[index] = 0;

    dst = dst.reshape((height, width))
    #エラーが出たので一度保存してから処理を行う
    cv2.imwrite("kekka_totyu.jpg",dst)
    im_re = cv2.imread("kekka_totyu.jpg")

    #画像からノイズを減らすために輪郭の中を白に染める
    gray2 = cv2.cvtColor(im_re, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.threshold(gray2, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    image, contours, hierarchy = cv2.findContours(gray2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    im_con = cv2.drawContours(im_re, contours, 0, (255,255,255), -1,)

    #クロージング処理
    cv2.imwrite("kekka.jpg",im_con)
    closing = cv2.morphologyEx(im_con, cv2.MORPH_CLOSE, kernel)
    cv2.imwrite("closing10.jpg", closing)

    return closing

if __name__ == '__main__':
    param = sys.argv
    gazou = labelling(mask(param))

試したこと

現在は下記のリンクを参考にして、手の輪郭からカーブの度合いを調べた後、傾きによって指かどうかを判定して指先を検出しようかと考えています。
ARToolKitの物体認識 その② 指認識

補足情報(言語/FW/ツール等のバージョンなど)

Python 3.6.3
OpenCV 3.3.1
mac OS Sierra 10.12.5

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

手の甲を大きな円として認識し、それからできるだけ離れている小さな近傍を探索すればいいと思います。画像の白い部分を積分して、手の重心を求めます。その重心から極座標でできるだけ離れた近傍を探索します。そのとき、極大点のようなものが出てくるので、それを重心からの偏差などを求めて指先かどうかを判定していきます。そんなに難しい処理ではないように思います。

ただ、腕の部分が多くなると難しくなると思います。指を認識する前に、手を認識する必要があるかもしれません。まったくの専門外で、アルゴリズム論しか知りませんが、私からのアイディアはそんな感じです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/03 16:17 編集

    返信が遅くなりましたが、回答ありがとうございます。教えて頂いた方法でやってみようと思いますが、他にも様々な意見を聞いてみたいため、しばらくは受付中のままにさせて頂きます。申し訳有りません。

    キャンセル

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

ただいまの回答率

91.26%

関連した質問

  • 受付中

    Pythonでラベリングし、色付けする方法

    前提・実現したいこと pythonで二値画像のラベリングを行い、一番面積の大きいラベル以外を黒く塗りつぶしたいのですが、方法が分からず困っています。 画像の真ん中の白い部分だけ

  • 受付中

    C++のCAD上で作成した図形の輪郭切り取り

    C++ ```###前提・実現したいこと CADで図のような立体画像を作成し、この画像の赤い部分のような、輪郭画像を抽出するプログラムを作成しました。このプログラムを使用し現在

  • 解決済

    python3+OpenCVで、特定色の箇所を白い線で囲いたい

    お世話になっております。 今回は、python3 + opencvにて以下のようなことをやりたいと考えているのですが、どのようにすれば実現できるのか分からない為、ご質問させて

  • 受付中

    raspberrypi+python+openCV+WebCam 動画顔認識してくれません

    前提・実現したいこと USB CAM からの動画をキャプチャーし、顔認識し、四角い枠で囲みたいです。 発生している問題・エラーメッセージ 下記コードで、facer

  • 解決済

    checkBoxの境界線

    checkBoxでAppearanceプロパティをButtunにしたときのフォーカス場所??の色を変更したいのですが、やり方がわかりません。 写真でいう水色になっているところです。

  • 解決済

    UnityでSpriteを使って一部を透明化する方法

    最近、シーンチェンジを実装するために基礎となる画像をSpriteを用いて一部透明化しようと考えたのですが、当たり前ですが単純に配置しても基礎画像が表示されてしまいます。(以下参考画

  • 解決済

    pythonの図示 matpotlib

    pythonで四角形が格子状に区切られそれぞれの点に数字が振られています。それをコンターマップのように(ただし、等高線はいらない)図示したいのですがどのように書けばよいでしょうか

  • 解決済

    opencv python 画像処理

    # -*- coding: utf-8 -*- import cv2 import numpy as np # フレーム差分の計算 def frame_sub(src1, src

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

  • Python

    4191questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    2747questions

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

  • OpenCV

    670questions

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