2014-09-02 4 views
0

저는 LinkSprite JPEG 컬러 카메라와 LPC1768 mbed 마이크로 컨트롤러를 구입했습니다. "LinkSprite"카메라로 jpeg 형식으로 이미지를 가져올 수 있으며 제공되는 자습서에 따라 전송할 수 있고 desktop.But에서 이러한 이미지를 볼 수 있습니다 "LPC1768 mbed"마이크로 컨트롤러에서 이러한 이미지를 처리하고 싶습니다. 예를 들어 루프를 원합니다. 해당 이미지의 각 행과 열을 통해 색상과 일치시킵니다. 아무도 내가 어떻게 2D 배열로 전체 이미지를 수신 한 다음 배열과 같은 색상으로 빨간색으로 일치시킬 수 있는지 말해 줄 수 있습니까? 다른 문제는 데이터가 보이는 것처럼 이미지를 전송할 때입니다. ff d8 ff e0 00 10 ........... 40 c6 81 90 b9 aaee 68 19 ff d9. jpeg 이미지가 ff d9로 시작하고 ff d9로 끝나는 것을 알고 있습니다. 그러나 어떻게 그 값들 사이의 픽셀을 식별 할 수 있으며, 붉은 색과 일치하는지 여부를 어떻게 비교할 수 있습니까 ??? 카메라마이크로 컨트롤러로 수신되는 이미지

코드

bool JPEGCamera::processPicture() { 
if (state == PROCESSING) { 
    bt.printf("\n\nNew Image \n\n"); 
    if (address < imageSize) { 
     char data[2048]; 
     int size = readData(data, min(sizeof(data), imageSize - address), address); 
     int ret = fwrite(data, size, 1, fp); 
     for (int i=0; i<size; i++) bt.printf("%x ",data[i]); 
     if (ret > 0) 
      address += size; 
     if (ret == 0 || address >= imageSize) { 
      stopPictures(); 
      fclose(fp); 
      wait(0.1); // ???? 
      state = ret > 0 ? READY : ERROR; 
     } 
    } 
} 

return state == PROCESSING || state == READY; 

}

내가 이미지를 저장할 수있는 방법이 있나요 사진을 촬영하고 JPEGCamera.cpp에서 바이트

int main() { 
JPEGCamera camera(p9, p10); // TX, RX 
LocalFileSystem local("local"); //save images on mbed 
Timer timer; 
timer.start(); 
if(camera.setPictureSize(JPEGCamera::SIZE160x120)) 
{ 
    myled1 = 1; 
    wait(2.0); 
    myled1 = 0; 
    wait(2.0); 
} 
for (int i = 1; i < 3; i++) { 
    if (camera.isReady()) { 
     char filename[32]; 
     sprintf(filename, "/local/pict%03d.jpg", i); 
     printf("Picture: %s \n", filename); 
     if (camera.takePicture(filename)) { 
      while (camera.isProcessing()) { 
       camera.processPicture(); 
      } 


      myled1 = 1; //show successful picture was taken 
      wait(2.0); 
      myled1 = 0; 
     } else { 
      printf("take picture failed\n"); 
      myled3 = 1; //show picture take failed 
      wait(2.0); 
      myled3 = 0; 
     } 
    } else { 
     printf("camera is not ready\n"); 
     myled4 = 1; //show camera is not ready 
     wait(2.0); 
     myled4 = 0; 
    } 
} 

을 이미지 바이트를 전송하는 "processPicture"함수에서 배열의 바이트 ?? 저장된 이미지를 단순히 읽을 수있는 방법이 있습니까 ???

+0

* jpeg *는 * bmp *와 다릅니다. 그것은 이미지의 압축 된 버전입니다. 실제 색상을 얻으려면 먼저 * 디코딩 *해야합니다. –

+0

어떻게 그럴 수 있습니까 ??? @ valter – DarkenShooter

+0

"processPicture"함수에서 배열에 이미지 데이터를 저장할 수있는 방법이 있습니까 ?? – DarkenShooter

답변

1

아마도 스스로 JPEG 압축 해제/디코딩을 다시 구현할 준비가되지 않았을 것입니다. 따라서 임베디드 환경에서 빌드 (및 적합) 할 라이브러리를 찾아야합니다. 많은 표준 프로그래밍 라이브러리가 임베딩을 위해 설계되지 않았으므로 까다로울 수 있습니다.

Here is a discussion thread 임베드 된 컨텍스트에서 JPEG 디코딩. 한 가지 요점은 JPEG 이미지를 처리하는 것이 RAM을 많이 먹고 있다는 것이며 your microcontroller은 32KB의 RAM 만 가지고 있다는 것입니다. 정말 많이는 아니지만 24 비트 이미지의 단일 픽셀에는 3 바이트가 필요합니다.

하나의 옵션은 '스트리밍'방식 일 수 있습니다. 한 번에 하나의 스캔 라인을 저장할 필요가 없으며 (대략) 그 이상을 저장할 필요는 없습니다.하지만 JPEG를 디코딩 할 수 있는지 또는 라이브러리가 존재하는지 여부는 확실하지 않습니다. 더 많은 연구를해야합니다.

+0

내 이미지 크기가 160 * 120입니다. 마이크로 컨트롤러에는 충분하지 않습니까 ?? @unwind – DarkenShooter

+0

@DarkenShooter 직접 160 * 120 * 3을 계산할 수 있다고 말해주십시오. :) 전체 이미지가 한 번에 압축되지 않은 상태로 저장되는 경우 아니요, 32KB RAM에 맞지 않습니다. 물론 일반적인 JPEG 디코더도 압축 된 데이터에 동시에 액세스해야합니다. – unwind