-2

我目前正在阅读 17 张图片(24 位,1200 x 1600)。读取 17 张图像花费了我大约 0.078 秒但是我想将这个大小为 5760000 的内存块转换为大小为 192000 的黑白图像来执行我的拉普拉斯边缘检测。现在我正在使用以下方法:

images.resize(rows * cols);
images.reserve(rows * cols);

for(int z = 0; z < rows * cols; z ++){
    pix.blue = (int) *(pChar + z * 3);
    pix.green = (int) *(pChar + z * 3 + 1);
    pix.red = (int) *(pChar + z * 3 + 2);
    pix.black_white = pix.blue * .11 + pix.green * .59 + pix.red *.3;
    images.at(z).black_white = pix.blue * .11 + pix.green * .59 + pix.red *.3;
}

然而,这个读取 pChar 内存块并写入大小为 1920000 的向量的过程花费了我 2.262 秒的总时间来读取 17 张图像。有没有更快的方法可以解决这个问题?

我尝试在下面使用不同的代码,但 pChar2 不断告诉我它在 VS2010 的调试模式下有一个 badptr:(data_grey,pChar,pChar2 变量是一个无符号字符 *)

pChar = (unsigned char*) malloc (sizeof(char)*3*rows*cols);
pChar2 = (unsigned char*) malloc (sizeof(char) * rows * cols);
fread(pChar, sizeof(char), 3*rows*cols, bmpInput);
images.at(i).data = pChar;

for(int z = 0; z < rows * cols; z ++){
    pix.blue = (int) *(pChar + z * 3);
    pix.green = (int) *(pChar + z * 3 + 1);
    pix.red = (int) *(pChar + z * 3 + 2);
    pix.black_white = pix.blue * .11 + pix.green * .59 + pix.red *.3;
    pChar2 += (unsigned char) pix.black_white;
}
    images.at(i).data_grey = pChar2;

我的想法是我可能以不正确的方式写入 pChar2 内存块。但是第二种方法要快得多,所以我想知道我应该如何解决它。如果我有一块用于 images.at(i).data_grey 的黑白内存块,那将是理想的。我主要想这样做,因为它比向量快得多,但是我在基于向量的代码上做错了什么,这使得它比较慢?(我个人觉得向量更容易使用,但如果我非常需要速度,所以如果它应该更快,我将处理内存块)

4

2 回答 2

0

不要使用边界检查元素访问器at()。这将每次检查您的索引,因为如果您使用越界索引,它必须抛出异常。这绝不应该发生,因为您最初调整了矢量的大小。

因此,您应该改用非边界检查运算符[]

您也可以像 C 数组一样直接写入向量。一些纯粹主义者可能会对此感到不安,但我认为可以使用向量:

images.resize(rows*cols);
unsigned char *bwPixel = &images[0];

for( ... )
{
    // ...
    *bwPixel++ = (unsigned char) (pix.blue * .11 + pix.green * .59 + pix.red *.3);
}
于 2013-06-04T03:37:37.843 回答
0

我认为你需要做的是改变

pChar2 += (unsigned char) pix.black_white;

pChar2[z] = (unsigned char) pix.black_white;

假设您正在尝试执行我认为您正在尝试执行的操作(为指向 pChar2 的内存块分配一个值,然后将指针移动到下一个 8 位内存块?)

于 2013-06-04T03:36:40.190 回答