いつもお世話になっております.
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++です.
アドバイス宜しくお願い致します.
No.2ベストアンサー
- 回答日時:
オフセットは必ず必要です。
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();
}
回答ありがとうございます.
おかげさまで目標を達成することが出来ました.
原因はオフセットを考慮していないことでした.
また,OpenCVを初めて間もないので,ソースコードも非常に参考になりました.
適切なアドバイスをしていただき,有難うございました.
No.1
- 回答日時:
1) ROI の指定方法が異なります.ROI付きの cv::Mat は,まず画像全体を参照する cv::Mat 型の変数を作った後に,その一部を参照する cv::Mat 型変数として作成します.以下のコードの3行目です.
2) OpenCV は,内部リソース管理がなされている,通常ポインタを通しては使いません.
以上を踏まえて,今回の例で行くと
cv::Rect roi(roi_x, roi_y, roi_w, roi_y);
cv::Mat inputimage(640, 480, CV_8UC1, 0);//dataはbyte型
cv::Mat inputimage_roi = inputimage(roi);
でいけるはずです.お試し下さい.
この回答への補足
補足します.
下記のコードを書きましたが上手くいきません.
もしかして,出力された座標値にオフセットが必要でしょうか?
std::string FilePath("sample.bmp");//sample.bmpは640*480のRGBの画像
const char *imagename = FilePath.c_str();
cv::Mat rgb_img = cv::imread(imagename);
cv::Mat gray_img;
cv::cvtColor(rgb_img, gray_img, CV_BGR2GRAY);
cv::Rect mask(320, 240,320, 240);
cv::Mat InuptImage_roi_cv= gray_img(mask);
std::vector<cv::KeyPoint> corners;
cv::FAST(InuptImage_roi_cv, corners, 50, true);
回答ありがとうございます.
試してみたのですが,上手くいきません.
cv::Rect roi(320, 240, 320, 240);
cv::Mat inputimage(640, 480, CV_8UC1, data);//dataはbyte*型
cv::Mat inputimage_roi = inputimage(roi);
であっていますでしょうか?
また,同じ画像の複数の領域に対して特徴点検出を実行したい場合,ROIを複数個所に設定できるでしょうか?
それとも,そんなことは普通はしませんか?
アドバイス宜しくお願い致します.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【WPF】画像の切り替え
-
Excel ユーザーフォームで表示...
-
UWSC 画像判定と条件分岐について
-
HTMLで画像をポップアップで表...
-
「using Windows」でエラーが出る
-
UWSCの色判定
-
画像の比較
-
画像を表示するには
-
ホームページバナーを(画像が...
-
VB.NETの画像の切り取り...
-
OpenCVでマスク処理で「ぼかし...
-
UWSC「画像が無い場合」
-
同じ画像を複数回表示させる
-
C#のForm内に複数画像を繰り返...
-
画像処理したBitmapをピクチャ...
-
UWSCを使って画像リンクをクリ...
-
OpenCVによる面積算出
-
C#で画像を他の画像に貼り付け...
-
プログラムをやっているのです...
-
UWSCについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
背景画像の繰り返しについて
-
Excel ユーザーフォームで表示...
-
EXCEL VBA 複数のImageコントロ...
-
uwcs のマクロで画像認識をして...
-
VBAのユーザーフォームのイメー...
-
UWSC 画像判定と条件分岐について
-
【WPF】画像の切り替え
-
「using Windows」でエラーが出る
-
gif 画像上の ボタンに リン...
-
jqueryスライダーを2段でスライ...
-
UWSC「画像が無い場合」
-
同じ画像を複数回表示させる
-
UWSCの色判定
-
【EXCEL VBA】ダブルクリックで...
-
UWSCでループ処理がうまくいき...
-
画像のビット数を変更する方法
-
VBA シート毎に画像挿入
-
vb.net 画像の透過について
-
uwscの画像認識に失敗します。
-
C#で画像を他の画像に貼り付け...
おすすめ情報