2009-11-04 7 views
0

Quand je lance le programme suivant avec scalefactory supérieur à 1,5, le programme lance un EXC_BAD_ACCESS. Le programme met à l'échelle une image.accès matrice OpenCV produit 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; 

} 

Si par ex. J'ai mis scalefactorx = 5, scalefactory = 2, il échoue autour de x = 1356 et y = 409.

J'espère que vous pouvez m'aider.

Répondre

2

Je ne suis pas trop familier avec OpenCV, mais il me semble que vous lisez en dehors des limites sur la matrice d'entrée.

J'écrirait quelque chose comme ceci:

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

Je n'ai pas testé, mais il doit être clair que cela fait (De plus, il est plus facile de déboguer que cette masse d'une ligne d'indexation :)

Bonne chance.

-Tom

+1

+1: la lisibilité des privilèges, toujours :) –

+0

Hey Tom, Il "fonctionne" quand j'utilise votre méthode mais chaque 2. rangée de pixels de l'image de sortie est manquante. – spangs