当我运行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附近失败。
希望你能帮助我。
答案 0 :(得分: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