코드에 몇 가지 문제점이 있습니다. 가장 눈에 띄는 루프 안쪽 내에서 제공 :
sum=0;
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
*Image = sum/4;
를 여기, 당신은 단순히 이상 sum
4 배 같은 값을 추가 한 다음 네 가지로 구분했다. 이 6 줄은
*Image = PaintBox1->Canvas->Pixels[ i ][ j ];
과 동일하게 만듭니다. 분명히 실제로 각 채널의 평균을 원했습니다. 당신의 RGB 이미지는 세 가지 차원 배열로 구현 된 경우이 아마 같이 보일 것이다 : 당신의 RGB 이미지가 실제의 2 차원 배열로 구현처럼
sum = 0;
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 0 ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 1 ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 2 ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 3 ];
*Image = sum/4;
그러나, 당신의 코드 예제에서, 그것은 본다 (un) signed integer. 이 경우, 다음 코드 (제공 정수 시스템에 4 바이트이다) 충분해야합니다
sum = 0;
unsigned int pixel = PaintBox1->Canvas->Pixels[ i ][ j ];
for(int k = 0; k < 4; ++k)
{
sum += pixel & 0xFF;
pixel >>= 1;
}
*Image = sum/4;
내가 볼 다른 주요 문제는 당신이 당신의 그레이 스케일 배열의 시작 부분에 대한 포인터를 유지하지 않는다는 것입니다.
Image = new unsigned char[ 160 * 120 * 1 ];
으로 초기화합니다.
// before the for loops
Image = new unsigned char[ 160 * 120 * 1 ];
unsigned char * temp = Image;
// at the end of the inner for loop:
temp++;
:하지만 그때마다 루프를 통해, 당신은 당신이 배열의 시작 부분에 대한 포인터를 유지하고, 반복자 역할을 임시 포인터가 있어야
Image++;
오히려 작성했습니다
따라서 포인터 만 이동하고 Image
은 고정 된 상태로 유지됩니다.
터보 C++은 더 이상 존재하지 않습니다. Visual Studio 2005/2008/2010으로 이동하여 무료 * Express * 에디션을 제공하십시오. 그런 다음 심각한 작업을하기 위해 OpenCV (이미지 처리를위한 크로스 플랫폼 라이브러리)를 사용하십시오. – karlphillip
나는 무엇보다도 당신이 말한 것에 동의합니다. 그러나 플랫폼을 변경하는 것은 내가 결정할 수있는 것이 아닙니다. – Chang