C 单片机图像接收

C 单片机图像接收,c,image-processing,microcontroller,lpc,C,Image Processing,Microcontroller,Lpc,我买了LinkSprite JPEG彩色照相机和LPC1768 mbed微控制器。通过“LinkSprite”相机,我可以拍摄jpeg格式的图像,根据他们提供的教程,我可以在桌面上传送和查看这些图像。但我想在“LPC1768 mbed”微控制器中处理这些图像。例如,我想循环该图像的每一行和每一列,以匹配颜色。有谁能告诉我如何将整个图像接收到一个2D数组中,然后在数组中循环以匹配红色这样的颜色。另一个问题是,当我传输图像时,数据看起来像。ff d8 ff e0 00 10 40 c6 81 90

我买了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图像以FFD9开头,以FFD9结尾。但我如何在这些值中识别一个像素,如何比较颜色是否与红色匹配

摄像机拍照和逐字节传输图像的代码

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;
    }
}
intmain(){
JPEG摄像机(第9页,第10页);//发送,接收
LocalFileSystem local(“local”);//在mbed上保存图像
定时器;
timer.start();
if(camera.setPictureSize(JPEGCamera::SIZE160x120))
{
myled1=1;
等待(2.0);
myled1=0;
等待(2.0);
}
对于(int i=1;i<3;i++){
if(camera.isReady()){
字符文件名[32];
sprintf(文件名,“/local/pict%03d.jpg”,i);
printf(“图片:%s\n”,文件名);
if(照相机.拍照(文件名)){
while(camera.isProcessing()){
camera.processPicture();
}
myled1=1;//显示拍摄成功的照片
等待(2.0);
myled1=0;
}否则{
printf(“拍照失败\n”);
myled3=1;//显示拍照失败
等待(2.0);
myled3=0;
}
}否则{
printf(“相机未准备就绪\n”);
myled4=1;//显示摄像机未准备就绪
等待(2.0);
myled4=0;
}
}
在jpegamera.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;
bool-JPEGCamera::processPicture(){
如果(状态==处理){
bt.printf(“\n\n新图像\n\n”);
if(地址<图像大小){
字符数据[2048];
int size=readData(数据,min(sizeof(数据),imageSize-address),address);
int-ret=fwrite(数据,大小,1,fp);
对于(int i=0;i 0)
地址+=大小;
如果(ret==0 | |地址>=imageSize){
停止();
fclose(fp);
等待(0.1);/????
状态=ret>0?准备就绪:错误;
}
}
}
返回状态==处理| |状态==准备就绪;
}


是否有任何方法可以将图像字节存储在“processPicture”函数的数组中??
有什么方法可以简单地读取存储的图像吗?

您可能还没有准备好自己重新实现JPEG解压缩/解码。因此,您需要找到一个库,它将构建(并适合)在您的嵌入式环境中。这可能很棘手,因为许多标准编程库不是为嵌入而设计的

关于在嵌入式环境中JPEG解码的问题。一个问题是处理JPEG图像相当需要RAM,只有32 KB的RAM。这实际上不是很多,考虑到一个24位图像的单个像素需要3个字节。


一种选择可能是“流式”方法,在这种方法中,您一次解码一条扫描线,并且不必存储超过(大致)条扫描线但我不确定是否有可能用这种方式解码JPEG,或者是否存在这样的库。你需要做更多的研究。

JPEG不同于bmp。它是图像的压缩版本。要获得实际的颜色,你必须先解码。我该如何做???@valterIs有没有办法将图像数据存储在arra中在“processPicture”功能方面??为微控制器编程与在windows或linux中编程不同。您不能只使用printf、fread等功能。您必须编写代码与pc通信(通过usb i-recon)。可能您的编译器或微控制器的供应商确实支持一些C标准,但您不能确定。请阅读手册。查找从文件读取数据的函数等。我的图像大小为160*120。对于微控制器来说不够@unwind@DarkenShooter请告诉我你可以自己计算160*120*3不,如果整个图像一次未压缩地存储,那就不适合32 KB的RAM。当然,典型的JPEG解码器也需要同时访问压缩数据。