我目前正在阅读 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 的黑白内存块,那将是理想的。我主要想这样做,因为它比向量快得多,但是我在基于向量的代码上做错了什么,这使得它比较慢?(我个人觉得向量更容易使用,但如果我非常需要速度,所以如果它应该更快,我将处理内存块)