いつもお世話になっております.
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で質問しましょう!
似たような質問が見つかりました
- 生物学 脳の記録部位の集計方法について 1 2022/06/11 21:26
- 筋トレ・加圧トレーニング 授業中/勤務中の筋トレ。 授業中や、デスクワークの仕事中にあまり目立たない筋トレを考案したので、評価 4 2022/07/31 04:55
- 楽器・演奏 楽譜読める方に質問です。 ト音記号とへ音記号が上段下段にあって、右手左手で弾くと思いますが、画像の場 5 2022/10/19 13:46
- 神経の病気 手首の痛みの原因を教えて下さい。 6 2022/08/02 06:56
- Excel(エクセル) ある文字を含む際に、値を返す数式についてです 5 2022/08/28 16:58
- 物理学 比内部エネルギーはなぜこの様な式で表されるのですか。 Cv=の式は定義なので分かります。 また右下の 1 2022/04/12 16:04
- Word(ワード) ワード。長い四角の中に文字を体裁良く入力するには。 2 2022/09/24 14:19
- プリンタ・スキャナー 封筒印刷 差出人印刷ずれる 4 2022/05/01 10:12
- 野球 バットの握り方の是非 5 2023/04/17 18:18
- リフォーム・リノベーション こちらの檜の建具を枠ごと外したいです。 因みに、下記の様に試みました。 1 上枠の内側 (左右と真ん 4 2023/04/22 20:12
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【WPF】画像の切り替え
-
UWSC 画像判定と条件分岐について
-
jqueryスライダーを2段でスライ...
-
EXCEL VBA 複数のImageコントロ...
-
スマホでサイトの画像を長押し→...
-
【VBA】Excel2016で画像を一括...
-
UWSC 画像認識で条件分岐
-
HPにドラッグアンドドロップ...
-
画像を二値化した後、黒の部分...
-
ホームページ作成ソフト 画像...
-
「using Windows」でエラーが出る
-
uwscの画像認識に失敗します。
-
Excel ユーザーフォームで表示...
-
画像処理したBitmapをピクチャ...
-
OpenCV でのROIの指定方法について
-
HTML 、 CSS ではみ出る線の表現
-
【EXCEL VBA】ダブルクリックで...
-
UWSCでループ処理がうまくいき...
-
C# Picturebox 縮小・拡大時の...
-
VBAのユーザーフォームのイメー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
背景画像の繰り返しについて
-
Excel ユーザーフォームで表示...
-
EXCEL VBA 複数のImageコントロ...
-
VBAのユーザーフォームのイメー...
-
uwcs のマクロで画像認識をして...
-
UWSC 画像判定と条件分岐について
-
【WPF】画像の切り替え
-
「using Windows」でエラーが出る
-
gif 画像上の ボタンに リン...
-
jqueryスライダーを2段でスライ...
-
同じ画像を複数回表示させる
-
UWSC「画像が無い場合」
-
UWSCの色判定
-
【EXCEL VBA】ダブルクリックで...
-
UWSCでループ処理がうまくいき...
-
画像のビット数を変更する方法
-
VBA シート毎に画像挿入
-
vb.net 画像の透過について
-
uwscの画像認識に失敗します。
-
C#で画像を他の画像に貼り付け...
おすすめ情報