電子書籍の厳選無料作品が豊富!

お世話になっております。
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");

A 回答 (2件)

そうではありません。


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画素を抜き出した画像、という意味になるので、エラーになるのも当り前です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/10/07 00:02

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



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


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

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

例えば
i=3 だと
x = x+11*2+1
で, +23
されてますよ。

この回答への補足

ありがとうございます。
三回目であれば、xは23の位置から11ピクセル、で正解ですのでOKです。

補足日時:2014/10/06 22:58
    • good
    • 0

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