柔軟に働き方を選ぶ時代に必要なこと >>

opencvのプログラムを用いて唇の形状を検出いています。
前処理として平滑化と二値化を行い、ラプラシアンをかけているのですがノイズが多く検出が難しいです。
検出には動的輪郭モデル(SNAKES)を用いています。
上手く検出する方法はないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

画像サイズ(解像度)に対して、唇が小さい場合はHaar-likeなどを用いてキャブレーションを行い(唇のおよその領域を検出して)からSnakeをかけてみてはどうでしょう?


口領域の抽出のHaar-likeは
http://alereimondo.no-ip.org/OpenCV/34
にあります。(口をあけず、正面を向いている場合の精度は高いと思います)

また、千葉大学の三宅研究室
http://www.mi.tj.chiba-u.jp/
で唇の検出をやっている学生がいらっしゃったので、一度コンタクトを取ってみることをお勧めします。

参考URL:http://alereimondo.no-ip.org/OpenCV/34
    • good
    • 0
この回答へのお礼

口領域も検出できるんですね。
Haar-likeを用いてがんばってみます。

お礼日時:2008/02/16 04:55

恐れ入ります。



私が学生の頃は、snakesと呼ばれる動的輪郭検出だと
1.最終的な形を与える(閉曲線の形)
2.大きなわっかを少しづつ変形させながら小さくしていく
3.ある程度、評価関数の値が一致したら、それで検出
という方法でした。
この方法だと、万能な唇の検出には向きません。(形が特定されるため)
他のマッチングが良いと思います。

個人的には、
・平滑化と二値化の部分をうまくやらないとノイズが多くなると思います。
・ラプラシアンをかけるなら、方向を考えるとうまくいくと思います。
 (例えば、正面の顔であれば上下2方向のラプラシアンをかける)

ある程度の精度で実用的な唇の検出を行いたいのでしたら、現在行われている前処理前に、やることがあると思います。
・正面から写した写真を使い、顔を切り出す(アゴと頭頂は比較的容易に判定可能なので)
・写真の下側かつ真ん中あたりにあたりをつける
・周囲よりも赤い部分だけ、特徴付けする

***

どのような用途を考えていらっしゃいますか?
画処理は外乱に非常に弱いです。その問題を解決するには、本当に画処理が必要ですか?そこの確認からかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
SNAKESでは唇検出は難しいですか。参考にしながら自分なりにもうちょっと頑張ってみます。

お礼日時:2008/02/16 04:53

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QOpenCV でのROIの指定方法について

いつもお世話になっております.
OpenCVに関する質問です.
FastFeatureDetectorやGoodFeaturesToTrackDetector等の特徴点検出器を入力画像の特定の部分に対して行うために,入力画像に対してROIを設定したのですが上手くいかない場合があって困っています.

たとえば,
入力画像(640*480)に対して,
左上(0,0)右下(640,480)や左上(0,0)右下(320,240)を矩形領域を指定すれば上手くいくのですが,
左上(10,10)右下(640,480)や左上(320,240)右下(640,480)だと,結果がズレてしまいます.

下記のソースコードで
---------------------------------------------------------------
cv::Rect* roi = new cv::Rect(roi_x, roi_y, roi_w, roi_h);
cv::Mat* InuptImage = new cv::Mat(640, 480, CV_8UC1, data);//dataはbyte型
InuptImage = new cv::Mat(*InuptImage, *roi);
---------------------------------------------------------------
(roi_x, roi_y, roi_w, roi_y)が
(0, 0, 640, 480)や(0, 0, 320, 240)の場合は上手くいくのですが,
(10, 10, 630, 470)や(320, 240, 320, 240)の場合には,特徴点の位置がずれたり,全体的に縮小されたりします.

どこに問題があるのでしょうか?

OpenCVは2.3で,言語はC++です.
アドバイス宜しくお願い致します.

いつもお世話になっております.
OpenCVに関する質問です.
FastFeatureDetectorやGoodFeaturesToTrackDetector等の特徴点検出器を入力画像の特定の部分に対して行うために,入力画像に対してROIを設定したのですが上手くいかない場合があって困っています.

たとえば,
入力画像(640*480)に対して,
左上(0,0)右下(640,480)や左上(0,0)右下(320,240)を矩形領域を指定すれば上手くいくのですが,
左上(10,10)右下(640,480)や左上(320,240)右下(640,480)だと,結果がズレてしまいます.

下記のソースコードで
---...続きを読む

Aベストアンサー

オフセットは必ず必要です。ROIを指定する前の画像の全体のサイズと、本来の画像の左上から、ROIの左上の座標のオフセットは、locateROI メソッドで取得することができます。

実際には、オフセットを考慮して点群座標を変換するか、特徴点を描画したい場合などでは、元の画像ではなく ROI で切り取った画像に対して描画を行います。


参考まで。



// okwave01.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <opencv2/opencv.hpp>

int main(int argc, char argv[])
{
const std::string FILE_PATH("lena.jpg");
//sample.bmpは640*480のRGBの画像

cv::Mat rgb_img = cv::imread(FILE_PATH);
// 画像読み込み

cv::Mat gray_img;
cv::cvtColor(rgb_img, gray_img, CV_BGR2GRAY);
// グレースケール画像に変換

const cv::Point ROI_TL(rgb_img.rows * 0.25, rgb_img.cols * 0.25);
const cv::Rect RECT(
rgb_img.rows * 0.25, rgb_img.cols * 0.25,
rgb_img.rows * 0.5, rgb_img.cols * 0.5);
// 中心 だけを切り取る ROI を作成。

cv::Mat rgbimage_roi = rgb_img(RECT);
cv::Mat grayimage_roi = gray_img(RECT);
// ROI による切り取り。


std::vector<cv::KeyPoint> corners;
// FAST 頂点座標の保存用変数

cv::FAST(grayimage_roi, corners, 10, true);

for (auto it = corners.begin(); it != corners.end(); ++it) {
cv::circle(grayimage_roi, it->pt, 1, cv::Scalar(255), 2);
// ROI を通してグレイスケール画像に書き込む

cv::circle(rgb_img, ROI_TL + cv::Point2i(it->pt), 1, cv::Scalar(0, 0xff, 0), 2);
// オフセットを考慮して直接RGB画像に書き込む
}

cv::imshow("RGB IMAGE", rgb_img);
cv::imshow("GRAY IMAGE", gray_img);
return cv::waitKey();
}

オフセットは必ず必要です。ROIを指定する前の画像の全体のサイズと、本来の画像の左上から、ROIの左上の座標のオフセットは、locateROI メソッドで取得することができます。

実際には、オフセットを考慮して点群座標を変換するか、特徴点を描画したい場合などでは、元の画像ではなく ROI で切り取った画像に対して描画を行います。


参考まで。



// okwave01.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <opencv2/opencv.hpp>

int main(int argc...続きを読む

QcvSnakeImageの定義の方法を教えて

Visual Studio C++とOpenCVでcvSnakeImageを用いた輪郭検出をしたいのですが、
error LNK2001: 外部シンボル "_cvSnakeImage" は未解決ですというエラーが出ます。


OpenCV2を用いて追加のインクルードに「C:\OpenCV2.2\modules\legacy\include」を設定し、#include < opencv2/legacy/legacy.hpp >も使用しているのですが。

リンカの設定に必要なパスを教えていただけないでしょうか。

Aベストアンサー

dumpbin.exeは使っていますか?

ライブラリファイルの中に入っているモジュールをリストアップできます。

.libの検索キーワードでOpenCV2をインストールしたディレクトリの中を
検索したら、何個か引っかかりませんか?(うろ覚えですみません)

その.libファイルをdumpbin.exeを使って中身を見てcvSnakeImageを
定義しているライブラリが見つかれば、それがリンクすべきライブラリ
ファイルです。

パスはそのライブラリが置いてあるパスを設定すれば良いだけですよ。


人気Q&Aランキング

おすすめ情報