• ベストアンサー
  • すぐに回答を!

OpenCVで固定枠で画像を操作するには

  • 質問No.8781520
  • 閲覧数536
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 84% (60/71)

お世話になっております。
OpenCVのエラーが解決せず困っています。

グレースケール画像170×170を
11×11枠のウィンドウで画像処理をして行きたいのですが
変数 x の2回目のループでエラーが発生してしまいます。

「型 'System.Runtime.InteropServices.SEHException' のハンドルされていない例外が
sample.exe で発生しました
追加情報: 外部コンポーネントが例外をスローしました。」

ROIの入れ物 dst_img をリセットしてみたり
あれこれやってみたのですがどうもうまくいきません。
2回目でコケるというのも情けなく。
どこを修正すればいいか、ぜひアドバイスいただけたら助かります。
よろしくお願い致します。

dst_img = cvCreateImage(cvSize(11,11), IPL_DEPTH_8U, 1);

int x, y, i;
i = 1;
for (y = 0; y < src_img_gray-> height; y = y +11*(i-1)+1) // y 座標を 11ピクセルずつ進める
{
for (x = 0; x < src_img_gray->width; x = x + 11*(i-1)+1) // x 座標を 11ピクセルずつ進める
{
dst_img = cvCreateImage(cvSize(12, 12), IPL_DEPTH_8U, 1);

cvSetImageROI(dst_img, cvRect(y, x, 11, 11));
//出力先指定  

           ↓xの2ループ目で、ここでエラーが発生します。
out_img = cvCloneImage(dst_img);

cvReleaseImage(&dst_img);
i = i + 1;
}
}
cvDestroyWindow("ROI");

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 55% (1857/3366)

そうではありません。
x=x+23
ということは、現在のxに+23したものが、次のxになります。
iの変化が、i=i+1だけだとすると

ループ開始
 x=0
終了直前
 i=i+1 /* i=1+1=2 になる */
forの式3の評価
 x=x+11*(i-1)+1
 /* x= 0 + 11*(2-1)+1 =0+12=12になる */
次のループ開始
 x=12
終了直前
 i=i+1 /* i=2+1=3 になる */
forの式3の評価
 x=x+11*(i-1)+1
 /* x= 12 + 11*(3-1)+1 =12+23=35になる */
...
となっています。

よく見たら、いろいろと間違ってますね。
cvSetImageROI(dst_img, cvRect(y, x, 11, 11));
は、 dst_img の 横y,縦xの位置から11x11のROIを設定して、以降、cvClomeImage(dst_img)等としたときに、dst_imgが、そのROIで指定した範囲だけの画像のように扱われる、というものです。
2回目では、x=12なので「 dst_img = cvCreateImage(cvSize(12, 12), IPL_DEPTH_8U, 1); で確保した 12x12(横0~11,縦0~11)の画像dst_img」の 座標(0,12)から11x11画素を抜き出した画像、という意味になるので、エラーになるのも当り前です。
お礼コメント
rosafilipes

お礼率 84% (60/71)

コメントありがとうございます。
そもそも、ROIで元画像のサイズそのものを指定するべきだったのですね。
細かく見てすぐにアドバイスくださって、いつも本当にありがとうございます。
今回も大変助かりました。
またぜひよろしくお願い致します。
投稿日時:2014/10/07 00:02

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 55% (1857/3366)

これが原因かはわかりませんが

http://opencv.jp/opencv-2.1/c/basic_structures.html#cvrect
説明になんと書いてありますか?


> x = x + 11*(i-1)+1) // x 座標を 11ピクセルずつ進

そうなってますか?
x,yの値を追ってみましょう

例えば
i=3 だと
x = x+11*2+1
で, +23
されてますよ。
補足コメント
rosafilipes

お礼率 84% (60/71)

ありがとうございます。
三回目であれば、xは23の位置から11ピクセル、で正解ですのでOKです。
投稿日時:2014/10/06 22:58
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ