我一直在墙上砸了大约一个星期,因为我无法正确访问整数图像的像素值。我删除了之前的帖子,因为这是我问题的一个更具体的例子。
我已经确定了确切的问题,即至少发现了一些疯狂的方法
出于调试目的,我不输出所有像素,只输出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开始。 我怎样才能消除这个问题?
亲切的问候,
答案 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的计算机来测试这个,所以我可能错了。