2

私はOpenCV2を初めて使用し、感情認識のプロジェクトに取り組んでおり、参照顔画像に対して顔画像を位置合わせしたいと考えています。回転に移る前に、画像の変換を機能させたいのですが。現在のアイデアは、x座標とy座標の両方で限られた範囲内で検索を実行し、差の2乗の合計をエラーメトリックとして使用して、画像を位置合わせするための最適なx/yパラメーターを選択することです。OpenCVのface_cascade関数を使用して顔の画像を検出しています。すべての画像のサイズが固定(128x128)に変更されています。質問:画像をx軸とy軸の両方で正/負の方向にシフトするには、マット画像のどのパラメータを変更する必要がありますか?setImageROIはMatデータ型でサポートされなくなったと思いますか?両方の面のROIを利用できますが、使用方法がわかりません。

void alignImage(vector<Rect> faceROIstore, vector<Mat> faceIMGstore)
{
  Mat refimg = faceIMGstore[1]; //reference image
  Mat dispimg = faceIMGstore[52]; // "displaced" version of reference image
  //Rect refROI = faceROIstore[1]; //Bounding box for face in reference image
  //Rect dispROI = faceROIstore[52]; //Bounding box for face in displaced image
  Mat aligned;

  matchTemplate(dispimg, refimg, aligned, CV_TM_SQDIFF_NORMED);
  imshow("Aligned image", aligned);
}

このアプローチのアイデアは、OpenCV2.4を使用してWindowsで作業しているRichardSzeliskiによる画像配置チュートリアルに基づいています。どんな提案でも大歓迎です。

4

1 に答える 1

2

cv::MatROIをサポートします。(ただし、COI(チャネルオブインタレスト)はサポートしていません。)

ROIを適用するには、operator()または特別なコンストラクターを使用できます。

Mat refimgROI  = faceIMGstore[1](faceROIstore[1]); //reference image ROI
Mat dispimgROI(faceIMGstore[52], faceROIstore[52]); // "displaced" version of reference image ROI

また、変位した画像内の最適な位置を見つけるには、matchTemplate関数を利用できます。


あなたのコメントに基づいて、2番目の(置き換えられた)パッチの近くの参照パッチの最適な位置を見つける次のコードを提案できます。

Mat ref = faceIMGstore[1](faceROIstore[1]);
Mat disp = faceIMGstore[52](faceROIstore[52]);

disp = disp.adjustROI(5,5,5,5); //allow 5 pixel max adjustment in any direction
if(disp.cols < ref.cols || disp.rows < ref.rows)
    return 0;
Mat map;
cv::matchTemplate( disp, ref, map, CV_TM_SQDIFF_NORMED );

Point  minLoc;
cv::minMaxLoc( map, 0, &minLoc );

Mat adjusted = disp(Rect(minLoc.x, minLoc.y, ref.cols, ref.rows));
于 2012-12-15T02:07:15.357 に答える