公式アカウントからの投稿が始まります

3次元配列を用いて、ルックアップテーブルを作成しているのですが、下のようなエラーが出て困っています。

『○○○の 0x000000013f336f85 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xffffffffffffffff を読み込み中にアクセス違反が発生しました。』

いろいろ調べてみたのですが、私自身の力だけでは解読できません。
どうぞよろしくお願いします。




//LUTの作成

int ***LUT = new int**[180];

for(int i=0;i<180;i++){
LUT[i] = new int*[255];
}
for(int i=0;i<180;i++){
for(int j=0;j<255;j++){
LUT[i][j] = new int[255];
}
}


for(int i = 0; i < 180; i++){
for(int j = 0; j < 255; j++){
for( int k = 0; k < 255; k++){

LUT[i][j][k]= 0;

if(6 < i && i< 38){
if( 79 < j && j < 256){
if( 0 <= k){
LUT[i][j][k] = 1;
}
}
}
}
}
}

//LUT作成終了


cvCvtColor(image3, image5, CV_BGR2HSV);
IplImage* image5 = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);

//if(hand == 0){
for(int i = 0; i < 480; i++){

for(int j = 0; j <680 ; j++){



//判定(LUT[ Hの値 ][ Sの値 ][ Vの値 ] )
if((LUT[(unsigned char)image5->imageData[( i * image5->widthStep + j) * 3 + 0]]
[(unsigned char)image5->imageData[( i * image5->widthStep + j) * 3 + 1]]
[(unsigned char)image5->imageData[( i * image5->widthStep + j) * 3 + 2]]) == 1){

printf("1\n");

}
else{
printf("0\n");
}

}
}


//LUT no atosyori
for(int i=0;i<180;i++){
for(int j=0;j<255;j++){
delete[] LUT[i][j];
}
}
for(int i=0;i<180;i++){
delete[] LUT[i];
}
delete[] LUT;

よろしくお願いします。

A 回答 (3件)

とりあえず, 配列の添え字が想定した範囲にあるかどうか確認してみてはどうでしょうか.



と書いておくけど,
・for(int j = 0; j <680 ; j++) は明らかに変
とか
・実は S や V は 255 まであり得る
とかいうオチだったりして.

あと, #1 を素直に受け取るなら添え字は
( i * image5->width + j) * 3 + 0
よりも
i * image5->widthStep + j * 3 + 0
の方が自然じゃないだろうか.
    • good
    • 1
この回答へのお礼

回答ありがとうございました.
HSVのところを256に変更してみたら,エラーなく動かすことができました!助かりました!

お礼日時:2013/01/27 22:16

関係ないかもしれんけど


cvCvtColor(image3, image5, CV_BGR2HSV);
IplImage* image5 = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
の部分, 何を期待しているんだろう.

この回答への補足

こちらのミスです.反対に書いてしまいました.
指摘ありがとうございます.

補足日時:2013/01/24 13:19
    • good
    • 0

http://opencv.jp/opencv-1.1.0/document/opencvref …
> int widthStep; /* アライメントが調整された画像の行のバイトサイズ */

ということで、widthStepまでチャンネル数倍する必要はありません

この回答への補足

ありがとうございます.
widthStepのところをwidthに変更してみたのですが,途中までうまくいっているのですが,止まるってしまいました.『○○○の 0x000000013f2c6f69 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xffffffffffffffff を読み込み中にアクセス違反が発生しました。』というエラーがまた出てきます.
よろしければ,回答よろしくお願いします.

if((LUT[(unsigned char)(image5->imageData[( i * image5->width + j) * 3 + 0])]
[(unsigned char)(image5->imageData[( i * image5->width + j) * 3 + 1])]
[(unsigned char)(image5->imageData[( i * image5->width + j) * 3 + 2])]) == 1){

補足日時:2013/01/24 13:18
    • good
    • 0

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