⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 张昆修改.c

📁 摄像头ov7620读取 并支持ARM芯片 获取图像到LCD
💻 C
📖 第 1 页 / 共 3 页
字号:
	// return get_first_frame(vd1);
	return 0;
}
/*********************************************************************************************************
** Function name: open_video2
** Descriptions: 通过该函数初始化视频设备
** Input: *fileptr,打开的文件名指针
** 	   *vd2,     参数指针
** 	   dep,     像素深度
** 	   pal,     调色板
** 	   width,   宽度
** 	   height,  高度
** Output : 无
** Created by:
** Created Date: 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int open_video2( char *fileptr,fb_v4l2 *vd2 ,int dep,int pal,int width,int height)
{
	// 打开视频设备
	if ((vd2->fd = open(fileptr, O_RDWR)) < 0) 
	{
		perror("v4l2_open:");
		return ERR_VIDEO_OPEN;
	}
	// 获取设备
	if (ioctl(vd2->fd, VIDIOCGCAP, &(vd2->capability)) < 0) 
	{
		perror("v4l2_get_capability:");
		return ERR_VIDEO_GCAP;
	}
	// 获取图象  
	if (ioctl(vd2->fd, VIDIOCGPICT, &(vd2->picture)) < 0) 
	{
		perror("v4l2_get_picture");
		return ERR_VIDEO_GPIC;
	}
	// 设置图象
	vd2->picture.palette = pal;		// 调色板
	vd2->picture.depth = dep;			// 像素深度

	vd2->mmap.format =pal;
	if (ioctl(vd2->fd, VIDIOCSPICT, &(vd2->picture)) < 0) 
	{
		perror("v4l2_set_palette");
		return ERR_VIDEO_SPIC;
	}
	// 
	vd2->mmap.width = width; 		// width;
	vd2->mmap.height = height; 	// height;
	vd2->mmap.format = vd2->picture.palette; 

	vd2->frame_current = 0;
	vd2->frame_using[0] = 0;
	vd2->frame_using[1] = 0;

	// 获取缓冲影射信息
	if (ioctl(vd2->fd, VIDIOCGMBUF, &(vd2->mbuf)) < 0) 
	{
		perror("v4l2_get_mbuf");
		return -1;
	}

	// 建立设备内存影射
	vd2->map = mmap(0, vd2->mbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED, vd2->fd, 0);
	if ( vd2->map < 0) 
	{
		perror("v4l2_mmap_init:mmap");
		return -1;
	}
	printf("The video device was opened successfully2.\n");
	// return get_first_frame(vd2);
	return 0;
}
/*********************************************************************************************************
** Function name:   prewitt8
** Descriptions:    用prewitt方法提取轮廓
** Input:  *ptr1,  输入的图象数据指针
** 	       *ptr2,  输出的图象数据指针
**         multiple 输出的图象的增益
** Output : 无
** Created by:
** Created Date: 
**********************************************************************************************************
** Modified by:程德芳
** Modified Date: 2007-4-14
*********************************************************************************************************/
void prewitt0(unsigned char *ptr1,unsigned char *ptr2,float multiple)
{
int d0,d1,d2,d3,d4,d5,d6,d7,d8;
int i,j,k,max,dat;
int m[8];
float zz;
for(j=1;j<239;j++)
{
for(i=1;i<319;i++)
{
d0=*(ptr1+(3*i-1)+(j-1)*318*3);
d1=*(ptr1+(3*i-1)+j*318*3);
d2=*(ptr1+(3*i-1)+(j+1)*318*3);
d3=*(ptr1+3*i+(j-1)*318*3);
d4=*(ptr1+3*i+j*318*3);
d5=*(ptr1+3*i+(j+1)*318*3);
d6=*(ptr1+(3*i+1)+(j-1)*318*3);
d7=*(ptr1+(3*i+1)+j*318*3);
d8=*(ptr1+(3*i+1)+(j+1)*318*3);
m[0]= d0+d1+d2+d3-2*d4+d5-d6-d7-d8;
m[1]= d0+d1+d2+d3-2*d4-d5+d6-d7-d8;
m[2]= d0+d1-d2+d3-2*d4-d5+d6+d7-d8;
m[3]= d0-d1-d2+d3-2*d4-d5+d6+d7+d8;
m[4]=-d0-d1-d2+d3-2*d4+d5+d6+d7+d8;
m[5]=-d0-d1+d2-d3-2*d4+d5+d6+d7+d8;
m[6]=-d0+d1+d2-d3-2*d4+d5-d6+d7+d8;
m[7]= d0+d1+d2-d3-2*d4+d5-d6-d7+d8;
max=0;
for(k=0;k<8;k++)
{
if(max<m[k])
max=m[k];
}
zz=multiple*(float)(max);
dat=(int)(zz);
if(dat>255)
{*(ptr2+i+j*318*3)=*(ptr1+i+j*318*3);
//*(ptr3+i+j*318)=max;
}
else
*(ptr2+i+j*318*3)=0;
}
}
}
/********************************************************************************************************************/
/*void prewitt(unsigned char *ptr1,unsigned char *ptr2)
{
int d0,d1,d2,d3,d4,d5,d6,d7,d8;
int i,j,k,max,dat;
int m[8];
int zz[320][240]={0};
for(j=1;j<239;j++)
{
for(i=1;i<319;i++)
{
d0=*(ptr1+(i-1)+(j-1)*318);
d1=*(ptr1+(i-1)+j*318);
d2=*(ptr1+(i-1)+(j+1)*318);
d3=*(ptr1+i+(j-1)*318);
d4=*(ptr1+i+j*318);
d5=*(ptr1+i+(j+1)*318);
d6=*(ptr1+(i+1)+(j-1)*318);
d7=*(ptr1+(i+1)+j*318);
d8=*(ptr1+(i+1)+(j+1)*318);
m[0]= d0+d1+d2+d3-2*d4+d5-d6-d7-d8;
m[1]= d0+d1+d2+d3-2*d4-d5+d6-d7-d8;
m[2]= d0+d1-d2+d3-2*d4-d5+d6+d7-d8;
m[3]= d0-d1-d2+d3-2*d4-d5+d6+d7+d8;
m[4]=-d0-d1-d2+d3-2*d4+d5+d6+d7+d8;
m[5]=-d0-d1+d2-d3-2*d4+d5+d6+d7+d8;
m[6]=-d0+d1+d2-d3-2*d4+d5-d6+d7+d8;
m[7]= d0+d1+d2-d3-2*d4+d5-d6-d7+d8;
max=0;
for(k=0;k<8;k++)
{
	if(max<m[k])
       max=m[k];
}

dat=(int)max;
*(ptr2+i+j*320)=(unsigned char)dat;

}
}
}
/*********************************************************************************************************
** Function name:   prewitt1
** Descriptions:    用prewitt方法提取轮廓
** Input:  *ptr1,  输入的图象数据指针
** 	       *ptr2,  输出的图象数据指针
**         multiple 输出的图象的增益
** Output : 无
** Created by:
** Created Date: 
**********************************************************************************************************
** Modified by:程德芳
** Modified Date: 2007-4-14
*********************************************************************************************************/
/*void prewitt1(unsigned char *ptr1,unsigned char *ptr2)
{
int d0,d1,d2,d3,d4,d5,d6,d7,d8;
int i,j,k,max,dat;
int m[8];

for(j=1;j<239;j++)
{
for(i=1;i<319;i++)
{
d0=*(ptr1+(i-1)+(j-1)*318);
d1=*(ptr1+(i-1)+j*318);
d2=*(ptr1+(i-1)+(j+1)*318);
d3=*(ptr1+i+(j-1)*318);
d4=*(ptr1+i+j*318);
d5=*(ptr1+i+(j+1)*318);
d6=*(ptr1+(i+1)+(j-1)*318);
d7=*(ptr1+(i+1)+j*318);
d8=*(ptr1+(i+1)+(j+1)*318);
m[0]= d0+d1+d2+d3-2*d4+d5-d6-d7-d8;
m[1]= d0+d1+d2+d3-2*d4-d5+d6-d7-d8;
m[2]= d0+d1-d2+d3-2*d4-d5+d6+d7-d8;
m[3]= d0-d1-d2+d3-2*d4-d5+d6+d7+d8;
m[4]=-d0-d1-d2+d3-2*d4+d5+d6+d7+d8;
m[5]=-d0-d1+d2-d3-2*d4+d5+d6+d7+d8;
m[6]=-d0+d1+d2-d3-2*d4+d5-d6+d7+d8;
m[7]= d0+d1+d2-d3-2*d4+d5-d6-d7+d8;
max=0;
for(k=0;k<8;k++)
{if(max<m[k])
max=m[k];}

dat=(int)max;

*(ptr2+i+j*320)=(unsigned char)dat;
}
}
}
/*********************************************************************************************************
** Function name:   median_value 中值滤波
** Descriptions:    求出9个像素的中间值
** Input:  *c,  像素
** Output : 无
** Created by:
** Created Date: 
**********************************************************************************************************
** Modified by:程德芳
** Modified Date: 2007-5-14
*********************************************************************************************************/
/*int median_value(unsigned char d[9])
{
int i,j,buf;
for(j=0;j<8;j++)
{
for(i=0;i<8;i++)
{
if(d[i+1]<d[i])
{
buf=d[i+1];
d[i+1]=d[i];
d[i]=buf;
}
}
}
return d[4];
}
/*********************************************************************************************************
** Function name:   gao_la24
** Descriptions:    对24位输入图像进行高斯拉普拉斯算子的边缘检测
** Input:  *ptr,  输入的图象数据指针
** Output : 无
** Created by:
** Created Date: 
**********************************************************************************************************
** Modified by:程德芳
** Modified Date: 2007-4-18
*********************************************************************************************************/		
unsigned char gao_la24(unsigned char *ptr,unsigned char *ptr1)
{
	long i,j,k,l;                                        
	unsigned char *m_temp;
	int vr,vg,vb,pg;                                     //中间变量

	//检测模板-高斯拉普拉斯卷积核
	int  g[25]={-2,-4,-4,-4,-2,
		-4, 0, 8, 0,-4,
		-4, 8,24, 8,-4,
		-4, 0, 8, 0,-4,
		-2,-4,-4,-4,-2};

	m_temp=malloc(320*240*3);

	//复制图象数据到中间缓存
	for(i=0;i<320*240*3;i++)
		m_temp[i]=*(ptr+i);

	for (i=0;i<320;i++)
	{
		for(j=0;j<240;j++)
		{
			vr=vg=vb=pg=0;

			for(k=i-2;k<i+3;k++)  //5*5模板
			{
				for(l=j-2;l<j+3;l++)
				{
					if(k>=0 && l>=0 && k<320 && l<240)
					{
						vr+=*(ptr+l*320*3+k*3)*g[pg];
						vg+=*(ptr+l*320*3+k*3+1)*g[pg];
						vb+=*(ptr+l*320*3+k*3+2)*g[pg];
						pg++;
					}
				}
			}

			if (vr<0)
				vr=0;
			if (vg<0)
				vg=0;
			if (vb<0)
				vb=0;

			m_temp[j*320*3+i*3]=vr;
			m_temp[j*320*3+i*3+1]=vg;
			m_temp[j*320*3+i*3+2]=vb;
		}
	}
	for (i=0;i<320*240*3;i++)
		*(ptr1+i)=m_temp[i];
	free(m_temp);
}
/*********************************************************************************************************
** Function name:   line 
** Descriptions:    线性灰度变换
** Input:  *ptr,  输入的图象数据指针
** Output : 图像灰度
** Created by:陈超
** Created Date: 2008.03.21
**********************************************************************************************************/

void line(unsigned char *ptr1,unsigned char *ptr2)
{
int i,j;
   
for(j=0;j<240;j++)
{
     for(i=0;i<320;i++)
	{  
		 if(*(ptr1 + 3*i + j*320*3)==*(ptr1+(3*i+1)+j*320*3)==*(ptr1+(3*i+2)+j*320*3)!=0)
         {
		 *(ptr2 + 3*i + j*320*3)=180*(*(ptr1 + 3*i + j*320*3)-200)/55+75;
		 *(ptr2 + (3*i+1) + j*320*3)=180*(*(ptr1 + (3*i+1) + j*320*3)-200)/55+75;
		 *(ptr2 + (3*i+2) + j*320*3)=180*(*(ptr1 + (3*i+2) + j*320*3)-200)/55+75;
		 }
	 }
}
}
/*********************************************************************************************************
** Function name:   grey和line 
** Descriptions:    灰度化,线性灰度变换
** Input:  *ptr,  输入的图象数据指针
** Output : 图像灰度
** Created by:陈超
** Created Date: 2008.03.21
**********************************************************************************************************/

void grey(unsigned char *ptr1,unsigned char *ptr2)
{
	unsigned char R,G,B,Y,Y1; 

int i,j;
   
for(j=0;j<240;j++)
{
     for(i=0;i<320;i++)
	{   
					//R=imageptr[0][0];
					R=*(ptr1 + 3*i + j*320*3);
					G=*(ptr1+(3*i+1)+j*320*3);
					B=*(ptr1+(3*i+2)+j*320*3);
					//Y=(R-G+B)/3;
					Y=(9798*R+19235*G+3735*B)/32768; //灰度处理
					
					// printf("Channels:%d,Audios:%d\n",vd2.capability.channels,vd2.capability.audios);
		
                    if(Y<180)
					{
					*(ptr2 + 3*i + j*320*3)=0;
					*(ptr2+(3*i+1)+j*320*3)=0;
					*(ptr2+(3*i+2)+j*320*3)=0;
					}
					else
					{
					
					*(ptr2 + 3*i + j*320*3)=Y;
					*(ptr2+(3*i+1)+j*320*3)=Y;
					*(ptr2+(3*i+2)+j*320*3)=Y;
					}

					/*if(Y<150)
					*(ptr2 + i + j*320)=0;
					
					else

                     *(ptr2 + i + j*320)=Y;
			           
					// printf("Channels:%d,Audios:%d\n",vd2.capability.channels,vd2.capability.audios);
					// *(ptr+i+j*320)=Y;
				}*/
	}
}
}
/*void grey1(unsigned char*ptr1,unsigned char *ptr2)
       
{
	unsigned char   R,G,B,Y;
int i,j;

for(j=0;j<240;j++)
			{
				for(i=0;i<320;i++)
				{   
					//R=imageptr[0][0];
					R=*(ptr1 + 3*i + j*320*3);
					G=*(ptr1+(3*i+1)+j*320*3);
					B=*(ptr1+(3*i+2)+j*320*3);
					Y=(9798*R+19235*G+3735*B)/32768;               //灰度处理
					// printf("Channels:%d,Audios:%d\n",vd2.capability.channels,vd2.capability.audios);
		
                    
					*(ptr1 + 3*i + j*320*3)=Y;
					*(ptr1+(3*i+1)+j*320*3)=Y;
					*(ptr1+(3*i+2)+j*320*3)=Y;
			        if(Y<100)
					*(ptr2 + i + j*320)=Y;   
					else
                      *(ptr2 + i + j*320)=255; 
					// printf("Channels:%d,Audios:%d\n",vd2.capability.channels,vd2.capability.audios);
					// *(ptr+i+j*320)=Y;
				}
			}
}
/*********************************************************************************************************
** Function name:   beijingzhibai
** Descriptions:    
** Input:  ptr1,  输入的数组数据指针(二值图像)
**         label,    标签序号
** Output : 无
** Created by:程德芳
** Created Date: 
**********************************************************************************************************
** Modified by:程德芳
** Modified Date: 2007-6-4
*********************************************************************************************************/
/*void beijingzhibai(unsigned char *ptr1,unsigned char *ptr2)
{
	int i,j;
	int label;
	int total[12];


	for(j=0;j<240;j++)
	{
		for(i=0;i<320*3;i++)
		{
			*(ptr1+i+320*3*j)=255;
		}
	}


	for(i=0;i<12;i++)
	{
		total[i]=0;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -