2009-11-04 83 views
0

当我运行scalefactory高于1.5的下列程序时,程序将引发EXC_BAD_ACCESS。 该程序缩放图像。OpenCV矩阵访问产生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失败。

希望你能帮助我。

回答

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]; 

我没有测试这一点,但它应该清楚这是什么东西做的(加上它更容易比索引的一个线量调试:)

祝你好运。

-Tom

+1

+1:特权可读性,总是:) – 2009-11-04 10:35:53

+0

喂汤, 它“作品”时,我用你的方法,但输出画面的像素的每2行缺少。 – spangs 2009-11-05 17:12:32