0

次のプログラムを scalefactory を 1.5 より大きくして実行すると、プログラムは EXC_BAD_ACCESS をスローします。プログラムは画像をスケーリングします。

#include <iostream>
#include <OpenCV/cv.h>
#include <OpenCV/highgui.h>
#include <cmath>

using namespace std;
using namespace cv;

int scale (int xyvalue, float scalefactor) {
    return ceil(xyvalue/scalefactor);
}

int main () {
    Mat input;

    float scalefactorx = 1.5;
    float scalefactory = 1.5;

    Mat output;
    input = imread("/tmp/plum_grey_scale_MC_.low.jpg", 0);

    output = cvCreateMat(input.size().height*scalefactory, input.size().width*scalefactorx, input.type());

    for (int y = 0; y<output.size().height; y++)
    {
        for (int x = 0; x<output.size().width; x++)
        {
            output.data[y*output.size().width+x] = input.data[scale(y,scalefactory)*input.size().width + scale(x,scalefactorx)];
        }
    }

    namedWindow("pic1", CV_WINDOW_AUTOSIZE);

    imshow("pic1", output);

    cvWaitKey(0);

    cvDestroyWindow("BlomsterBillede");



    return 0;

}

たとえば、scalefactorx = 5、scalefactory = 2 を設定すると、x=1356 および y=409 付近で失敗します。

あなたが私を助けてくれることを願っています。

4

1 に答える 1

2

私は OpenCV にあまり詳しくありませんが、入力行列の範囲外を読み取っているように見えます。

私は次のようにもっと書きます:

float xt = static_cast<float>(x) / static_cast<float>(output.size().width);
float yt = static_cast<float>(y) / static_cast<float>(output.size().height);
int out_idx = y*output.size().width+x;
int in_idx = (yt*input.size().height)*input.size().width + (xt*input.size().width);
output.data[out_idx] = input.data[in_idx];

私はこれをテストしていませんが、これが何をしているのかは明らかなはずです(さらに、1行の大量のインデックス作成よりもデバッグが簡単です:)

幸運を。

-トム

于 2009-11-04T10:17:44.043 に答える