神仙来了我也爱吃火锅 2023-11-06 11:54 采纳率: 0%
浏览 47
已结题

STM32系统,OV2640拍照变样

我在使用STM32系统,OV2640摄像头,进行物体拍照的时候,可以通过RGB565模式,成功投射到LCD上,但是存储下来就变了样了。
拍摄时使用的BMP格式。
在LCD屏幕上显示如下图

img


拍出来的存储效果,却如下图

img


看的出来,鼻子眼睛位置还在,就是走样了。当然拍摄的物体model原本是这个样子的

img



不知道有没有哪位朋友遇到过类似问题?
拍照部分代码(基本抄的正点原子的)

if(Time_counter==1000) //自己做的个计时,大约10s, 没有做按键 
        {    
            Time_counter=0;
            if(key==WKUP_PRES)  //写死了不会进这里
            {
                scale=!scale;  
                if(scale==0)
                {
                    OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真实尺寸
                    OV2640_OutSize_Set(lcddev.width,lcddev.height); 
                    sprintf((char*)msgbuf,"Full Size 1:1");
                }else 
                {
                    OV2640_ImageWin_Set(0,0,1600,1200);                //全尺寸缩放
                    OV2640_OutSize_Set(lcddev.width,lcddev.height); 
                    sprintf((char*)msgbuf,"Scale");
                }
                LCD_ShowString(30,50,210,16,16,msgbuf);//显示提示内容
                printf("%s\r\n",msgbuf);
                delay_ms(800);     
            }else if(sd_ok)//SD卡正常才可以拍照
            {  
                sw_sdcard_mode();    //切换为SD卡模式
                if(key==KEY0_PRES)    //BMP拍照 //写死了进行BMP拍照
                {
                    camera_new_pathname(pname,0);//得到文件名    
                    res=bmp_encode(pname,0,0,lcddev.width,lcddev.height,0);
                }else if(key==KEY1_PRES)//JPG拍照
                {
                    camera_new_pathname(pname,1);//得到文件名    
                    res=ov2640_jpg_photo(pname);
                    if(scale==0)
                    {
                        OV2640_ImageWin_Set((1600-lcddev.width)/2,(1200-lcddev.height)/2,lcddev.width,lcddev.height);//1:1真实尺寸
                        OV2640_OutSize_Set(lcddev.width,lcddev.height); 
                    }else 
                    {
                        OV2640_ImageWin_Set(0,0,1600,1200);    //全尺寸缩放 
                    }
                    OV2640_OutSize_Set(lcddev.width,lcddev.height);                     
                }
                sw_ov2640_mode();    //切换为OV2640模式
                if(res)//拍照有误
                {
                    Show_Str(30,130,240,16,"写入文件错误!",16,0);    
          printf("写入文件错误!\r\n");                    
                }else 
                {
                    Show_Str(30,130,240,16,"拍照成功!",16,0);                
                    Show_Str(30,150,240,16,"保存为:",16,0);
                    Show_Str(30+42,150,240,16,pname,16,0);
          printf("拍照成功!\r\n");    
                    printf("保存为:");    
                    printf("%s\r\n",pname);        
                    //BEEP=1;    //蜂鸣器短叫,提示拍照完成
                    delay_ms(100);
                }               
            }else //提示SD卡错误
            {                        
//                Show_Str(30,430,240,16,"SD卡错误!",16,0);
//                Show_Str(30,450,240,16,"拍照功能不可用!",16,0);              
        printf("%03d SD卡错误!\r\n",sd_ok);    
              printf("拍照功能不可用!\r\n");                    
            }       
            //BEEP=0;            //关闭蜂鸣器 
            if(key!=WKUP_PRES)delay_ms(1800);//非尺寸切换,等待1.8秒钟  
            DCMI_Start();     //停止显示              
            //Camera         拍照
            }

设置部分代码

DCMI_InitStructure.DCMI_CaptureMode=DCMI_CaptureMode_Continuous;//连续模式
    DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame;//全帧捕获
    //DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_1of4_Frame;//1/4捕获
    DCMI_InitStructure.DCMI_ExtendedDataMode= DCMI_ExtendedDataMode_8b;//8位数据格式  
    DCMI_InitStructure.DCMI_HSPolarity= DCMI_HSPolarity_Low;//HSYNC 低电平有效
    DCMI_InitStructure.DCMI_PCKPolarity= DCMI_PCKPolarity_Rising;//PCLK 上升沿有效
    DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware;//硬件同步HSYNC,VSYNC
    DCMI_InitStructure.DCMI_VSPolarity=DCMI_VSPolarity_Low;//VSYNC 低电平有效
    DCMI_Init(&DCMI_InitStructure);

    DCMI_ITConfig(DCMI_IT_FRAME,ENABLE);//开启帧中断 
    
    DCMI_Cmd(ENABLE);    //DCMI使能

  NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;        //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器、

  • 写回答

21条回答 默认 最新

  • DRobot 2023-11-10 23:54
    关注
    获得2.00元问题酬金

    如果你在将OV2640摄像头捕获的图像投射到LCD上时使用的是RGB565模式,并且存储下来的图像质量发生了变化,可能有几个原因导致这种情况发生。以下是一些可能的原因和解决方法:
    颜色空间转换问题:RGB565是一种16位颜色空间,而BMP格式通常使用24位或32位颜色空间。在将RGB565图像转换为BMP格式时,需要进行颜色空间的转换。如果转换过程中出现问题,可能会导致图像质量下降或颜色失真。解决方法是使用适当的颜色空间转换算法,以确保图像质量不受损失。
    图像缩放问题:如果投射到LCD上的图像尺寸与原始图像尺寸不同,可能需要执行图像缩放操作。如果缩放算法的质量不好,可能会导致图像失真或模糊。解决方法是使用高质量的图像缩放算法,以确保图像质量不受影响。
    图像保存设置问题:在保存图像时,可能需要对图像进行压缩或其他处理。如果保存设置不正确,可能会导致图像质量下降。解决方法是检查保存图像的设置,并确保它们与你的需求相匹配。
    硬件问题:最后,还需要考虑硬件方面的问题。例如,摄像头、LCD和存储设备可能存在质量问题,导致图像质量下降。解决方法是检查硬件设备的质量和连接是否正确。
    综上所述,要解决STM32系统、OV2640摄像头和BMP格式下图像存储质量下降的问题,需要检查颜色空间转换、图像缩放、保存设置和硬件设备等方面的问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 创建了问题 11月6日

悬赏问题

  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项