2014-09-02 46 views
0

我買了LinkSprite JPEG彩色攝像機和LPC1768 mbed微控制器。通過「LinkSprite」攝像頭,我可以以jpeg格式拍攝圖像,並根據他們提供的教程,我可以在桌面上傳輸和查看這些圖像。但我想在「LPC1768 mbed」微控制器中處理這些圖像。例如,我想循環通過該圖像的每一行和列來匹配顏色。任何人都可以告訴我如何將整個圖像接收到2D數組中,然後循環遍歷數組以匹配紅色等顏色。當我傳輸圖像數據看起來像另一個問題。 ff d8 ff e0 00 10 ........... 40 c6 81 90 b9 aa ee 68 19 ff d9。我知道jpeg圖像以ff d9開始,以ff d9結束。但是,我如何確定這些值中的一個像素,以及如何比較顏色與紅色是否匹配?在微控制器中接收圖像

代碼相機進行拍照和按字節傳輸圖像字節

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

在JPEGCamera.cpp

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; 

}

有,我可以存儲圖像的任何方式「processPicture」函數中的數組中的字節? 有什麼辦法可以簡單地讀取存儲的圖像?

+0

* jpeg *與* bmp *不同。它是圖像的壓縮版本。要獲得實際的顏色,您必須先*解碼*。 – 2014-09-02 08:01:59

+0

我該怎麼做? @valter – DarkenShooter 2014-09-02 08:05:56

+0

有沒有什麼辦法可以將圖像數據存儲在「processPicture」函數的數組中? – DarkenShooter 2014-09-02 08:07:00

回答

1

您可能沒有準備好自行重新實現JPEG解壓縮/解碼。所以你需要找到一個庫,它將在你的嵌入式環境中構建(並且適合)。這可能會非常棘手,因爲許多標準編程庫不適用於嵌入。

Here is a discussion thread關於嵌入式上下文中的JPEG解碼。有一點是,處理JPEG圖像相當需要內存,your microcontroller只有32 KB的RAM。這真的不是很多,考慮24位圖像的單個像素需要3個字節。

然後,一個選項可能是一種「流式傳輸」方法,您可以在其中解碼,例如,一次掃描一次,永遠不必存儲超過(大致),但我不知道是否有可能以這種方式解碼JPEG,或者如果存在任何這樣做的庫。你需要做更多的研究。

+0

我的圖像的大小是160 * 120。對於微控制器來說是不夠的? @unwind – DarkenShooter 2014-09-02 11:56:24

+0

@DarkenShooter請告訴我你可以自己計算160 * 120 * 3。 :)而且,如果整個圖像一次未壓縮存儲,則不適合32 KB的RAM。一個典型的JPEG解碼器當然也需要同時訪問壓縮的數據。 – unwind 2014-09-02 12:21:59