2013-06-04 3 views
-2

현재 17 개의 이미지 (24 비트, 1200 x 1600)를 읽습니다. 17 이미지를 읽는 데 약 .078 초 비용 그러나 나는 내 laplacian edge_detection을 수행하는 192000의 흑백 이미지 크기로 5760000의 크기 인이 메모리 블록을 변환하고 싶습니다. 지금은 다음과 같은 방법을 사용하고 있습니다 : 그러나 PChar는 메모리 블록을 읽고 나에게 17 개 이미지를 읽을 수 2.262 초 총 시간을 비용입니다 1920000의 벡터 크기로 작성프로그램 속도 향상 : 벡터 속도, 메모리 블록 속도

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; 
} 

이 과정을. 이 방법에 접근 할 수있는 더 빠른 방법이 있습니까?

내가 아래 다른 코드를 사용하여 시도했지만 pChar2 그것이 VS2010에 대한 디버그 모드에 badptr을 가지고 있음을 말해 계속해서 :

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; 

(data_grey이를 PChar는 pChar2 변수는 서명되지 않은 숯불 *입니다) 내 생각은 내가 잘못된 방식으로 pChar2 메모리 블록에 쓸 수 있습니다. 하지만이 두 번째 방법은 훨씬 빠르므로 어떻게 수정해야하는지 궁금합니다. images.at (i) .data_grey에 흑백 메모리 블록이 있다면 이상적입니다. 나는 주로 벡터보다 훨씬 빠르기 때문에 이것을하고 싶다. 그러나 벡터 기반 코드에 비해 내가 그렇게 느리게 만든다. (나는 개인적으로 사용하기 쉽게 벡터를 찾을 난 정말 심하게 속도를 필요로하는 경우가 빠를 것으로 예상되는 경우, 그래서 난 메모리 블록 작업을 처리합니다)

답변

0

나는 당신이해야 할 무슨 생각이 변화

pChar2 += (unsigned char) pix.black_white; 

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

당신은 내가 당신이 (할 pChar2가에서 지적되고있는 메모리 블록에 값을 지정하고 다음 8 비트 메모리 포인터를 이동하려는 생각에에 노력하고 가정에 블록?)

+0

예 tat이 내 의도였습니다. Thys – user2427671

0

범위 검사 요소 접근자인 at()을 사용하지 마십시오. 그것은 out-of-bounds 인덱스를 사용하는 경우 예외를 throw해야하기 때문에 매번 인덱스를 확인할 것입니다. 처음에 벡터의 크기를 조정했기 때문에 절대 일어나지 않아야합니다.

따라서 경계가없는 확인 연산자 []을 대신 사용해야합니다.

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