2014-09-02 67 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