2013-06-04 176 views
-2

我目前正在阅读17张图片(24位,1200 x 1600)。读17张图像花了我大约0.078秒但是,我想将这个5760000大小的内存块转换为192000的黑白图像大小来做我的laplacian edge_detection。现在,我使用下面的方法:提高程序速度:矢量速度,内存块速度

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内存块和写入的192万矢量大小花费我的2.262秒总时间,读取17倍的图像处理。有没有更快的方法可以处理这个问题?

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

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获得了一块黑白内存块,那将是理想的选择。我主要是想这样做,因为它比矢量快得多,但是在基于矢量的代码中,我做了一些错误,使得它比较慢? (我个人觉得载体更容易使用,但如果我需要的速度实在太差了,所以我会处理与存储块的工作,如果它应该是更快)

回答

0

我认为你需要做的是改变

pChar2 += (unsigned char) pix.black_white; 

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

假设你要什么,我认为你正在试图做的(值分配给内存块被指向pChar2,然后将指针移动到下一个8位内存块?)

+0

是的,我的意图是。 Thxs – user2427671

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); 
} 
+0

thxs的想法不好改变它,看看它如何改变性能 – user2427671