【问题标题】:OpenCV matrix access produces EXC_BAD_ACCESSOpenCV 矩阵访问产生 EXC_BAD_ACCESS
【发布时间】:2010-12-12 23:10:02
【问题描述】:

当我以高于 1.5 的 scalefactory 运行以下程序时,程序会抛出 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 左右失败。

希望你能帮助我。

【问题讨论】:

    标签: c++ matrix opencv exc-bad-access


    【解决方案1】:

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

    我没有对此进行测试,但应该清楚这是做什么的(而且它比一行索引更容易调试:)

    祝你好运。

    -汤姆

    【讨论】:

    • 嘿汤姆,当我使用你的方法但每 2 行输出图片的像素丢失时,它“有效”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2014-05-03
    • 2014-10-13
    • 2012-01-21
    相关资源
    最近更新 更多