OV7670上位机实现

 OV7670 是 OV(OmniVision)公司生产的一颗 1/6 寸的 CMOS VGA 图像传感器。该传感器体积小、工作电压低,提供单片 VGA 摄像头和影像处理器的所有功能。通过 SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率 8 位影像数据。该产品 VGA 图像最高达到 30 帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡度、色度等都可以通过 SCCB 接口编程。


 由于目前该摄像头模块笔者仍在调试中,所以具体下位机部分,将会在以后记载。

 笔者的上位机程序源代码放在了github上,上面包含由项目文件,如只是需要程序,可以发邮箱给我。需要注意的是,上位机是和下位机通过串口进行通讯的,因此,针对不同的下位机,也就需要由不同的上位机。笔者的上位机仍有不完善的地方,大家如果需要参考,切记要根据自己的下位机进行修改,或者按照我接下来的方式,修改你的下位机程序进行测试,这里是以OV7670的彩条测试为例。

1.下位机(单片机,笔者使用的是STM32ZET6(核心板)

下面是单片机模拟生成彩条的程序段

//单片机生成彩条测试
void OV7670_CreatColor()
{
	uint16_t i,j,k = 0;
	uint16_t color = 0;
	//列缓存区
	uint16_t buff[320];
  
	while(1)
	{
		//数据开始(从上往下,从左往右)
		printf("data:\n");
		
		for(i=0;i<240;i++)
		{
			printf("L");//列有效
			for(j=0;j < 320;j++)//一列
			{
				//生成彩条  9E F7,8D EF ,9E 3F,83 1F,FF F0,43 D9,95 28,82 10
				if(i < 30)
				{
					color = 0x9EF7;
				}else if(i < 60)
				{
					color = 0x8DEF;
				}else if(i < 90)
				{
					color = 0x9E3F;
				}else if(i < 120)
				{
					color = 0x831F;
				}else if(i < 150)
				{
					color = 0xFFF0;
				}else if(i < 180)
				{
					color = 0x43D9;
				}else if(i < 210)
				{
					color = 0x9528;
				}else
				{
					color = 0x8210;
				}
				buff[j] = color;
			}
			//准备好一列数据
			for(k=0;k<320;k++)
			{
				printf("%04X", buff[k]);//打印色条
			}
			printf("\n");
		}
	}
}

 2.上位机(采用C#和VS2015开发)

上位机主要是接收下位机发送的数据,并将数据显示在PictureBox中,中间需要用到串口类的监听数据是否到达的事件

DataReceived。

 /// <summary>
        /// 串口数据到达事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string data;
            Color[] colors;

            //检测串口是否打开
            if (isOpen)
            {
                //可能会出现意想不到错误的代码区域
                try
                {
                    //检测是否开始发送数据
                    if (sp.ReadLine().Equals("data:"))
                    {
                        start = true;
                    }
                    //开始读取数据
                    if (start)
                    {
                        //绘制图像(一列一列地绘制)
                        for (int Xcount = 0; Xcount < 240; Xcount++)
                        {
                            if (isOpen)
                            {
                                //读一列
                                data = sp.ReadLine();
                                if (data.StartsWith("L"))//列有效
                                {
                                    colors = RGBToBitmap(data.Substring(1));
                                }
                                else
                                {
                                    return;
                                }
                            }
                            else
                            {
                                return;
                            }

                            for (int Ycount = 0; Ycount < 320; Ycount++)
                            {
                                OvImage.SetPixel(Xcount, Ycount, colors[Ycount]);
                            }
                            this.pbImage.Image = OvImage;
                        }
                        start = false;//接收数据结束
                    }
                }
                catch (Exception ex)
                {
                    return;
                }
            }
        }

其他部分的代码请参见github上的代码,如有错误,欢迎大家批评指正,附模拟彩条测试效果。 


猜你喜欢

转载自blog.csdn.net/zyxhangiian123456789/article/details/79163959
今日推荐