OpenCV积分图像像素访问错误

时间:2012-01-28 20:01:10

标签: c++ opencv cuda gpu

我一直在墙上砸了大约一个星期,因为我无法正确访问整数图像的像素值。我删除了之前的帖子,因为这是我问题的一个更具体的例子。

我已经确定了确切的问题,即至少发现了一些疯狂的方法

出于调试目的,我不输出所有像素,只输出5行:

代码简洁明了(但无论如何都欢迎评论)

int main(){
    Mat src = imread("test.png");
    imshow("SOURCE", src);
    cvtColor(src, src, CV_BGR2GRAY);
    GpuMat gpu_src, gpu_ii;
    gpu_src.upload(src);
    integral(gpu_src, gpu_ii);
    Mat cpu_ii;
    gpu_ii.download(cpu_ii);
    imshow("Just for fun", cpu_ii);
    for (int j = 0; j < 8; j++) {
        for (int i = 0; i < 8; i++) {
            //Center Value: Pixel value at (i,j)
            int center_val = (int)cpu_ii.data[(i * cpu_ii.step) + (j * cpu_ii.elemSize())];
            cout << center_val << endl;
        }
        cout << "next line" << endl;
    }

}

现在,第一行打印0 0 0 ...,完美 第二行:160 64 224 128 32 192 96

显然这些结果是错误的。进一步来说: 预计第二个值的结果应该是320,顺便说一下大约是320-255。 结果清楚地表明,一旦总和的结果超过255,该值就从0开始。 我怎样才能消除这个问题?

亲切的问候,

2 个答案:

答案 0 :(得分:1)

像素值是正确的,但访问方式是错误的。

您可以使用at运算符:

cout << cpu_ii.at<int>(j, i) << endl;

或者,通过指针,使用整数指针。 img.data返回一个char *,如果没有转换为int,则表示您正在访问错误的内存位置:

int* data = (int*)cpu_ii.data;

int center_val = data[(i * cpu_ii.step) + (j * cpu_ii.elemSize())];
cout << center_val << endl;

答案 1 :(得分:0)

您的积分的目标图像似乎只有一个带有一个字节的通道。您应该尝试使用接收类型的GpuMap构造函数(常量如CV_32UC1)作为参数。

http://fossies.org/dox/OpenCV-2.3.1a/classcv_1_1gpu_1_1GpuMat.html

现在我没有安装openCV的计算机来测试这个,所以我可能错了。