📄 张昆修改.c
字号:
// 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 + -