Files
HandWritten-Analisys/测试/本机测试/转换图像文件到jpg/Cjbsb.cpp
yanshui177 962de04ffb 笔迹鉴别程序
考试的笔迹鉴别程序,分辨出不同人写的笔迹
2017-05-17 16:50:37 +08:00

105 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 程序名Cjbsb.c
功能:读入图像文件,甄别图像的角标
参数设置:
img 大图
imgjbsb 角标图像头
jbwhite 未知参数1
jbblack 未知参数2
【返回文字的笔迹部分】
注意:这个方法不行,另外一个号的方法:取一个方块,移动方块,确定方块中的样子,如果有横线或者数显就确定为脚标
*/
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
IplImage* Cjbsb(IplImage* img,IplImage* imgjbsb,int jbwhite,int jbblack){
/*定义变量*/
int i,j,ii,jj,sumjb1,sumjb2,jbi=0,jbj=0;
int height,width,step,channels;
uchar *data;
int brklab=0;
//1、 获取图像信息
height = img->height;
width = img->width;
step = img->widthStep;
channels = img->nChannels;
data = (uchar *)img->imageData;
//IplImage* imgjbsb = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
cvCopy(img,imgjbsb,NULL);
uchar *imgjbsbdata= (uchar *)imgjbsb->imageData;
//----------------------------------------//
//2、找脚标的位置
//----------------------------------------//
for(i=0;i<height/3;i++){
for(j=0;j<width/5;j++){
sumjb1=0;
for(ii=0;ii<=14;ii++) //计算特征点的下侧14与右侧14的白点数目(是因为脚标就是14的长度吧)
sumjb1=sumjb1+imgjbsbdata[(i+ii)*step+j*channels];//下侧14列的单点的白点数目
for(jj=0;jj<=14;jj++)
sumjb1=sumjb1+imgjbsbdata[i*step+(j+jj)*channels];//右侧14行的单点的白点数目
if(sumjb1<=255*jbwhite){ //jbwhite为允许角标上白点数第一次提取
sumjb2=0;
for(ii=i+2;ii<i+12;ii++)
for(jj=j+2;jj<j+12;jj++){
if(imgjbsbdata[ii*step+jj*channels]>=200)
sumjb2=sumjb2+imgjbsbdata[ii*step+jj*channels];
}
if(sumjb2>=255*(100-jbblack)){ //允许角标内黑点数,第二次提取
jbi=i;//脚标位置
jbj=j;
for(ii=i-2;ii<i+22;ii=ii+2) //标出位置
for(jj=j-2;jj<j+22;jj=jj+2){
imgjbsbdata[ii*step+jj*channels]=0;
}
brklab=1;
break;
}
}
}
if(1==brklab){
brklab=0;break;//退出标记
}
}
if(jbi==0 && jbj==0)
{
// jbi=142;
// jbj=25;
jbi=0;
jbj=0;
printf("\t\t\t甄别图像的角标失败,使用设定值Cjbsb角标识别\n");
}
cout<<"JB:"<<jbi<<" "<<jbj<<endl;
//----------------------------------------//
//3、以角标为起点进行裁剪与画框
//----------------------------------------//
// CvSize jbcjsize=cvSize(835,165); //角标裁剪框的大小宽为835象素高为165象素
CvSize jbcjsize=cvSize(833, 476);
IplImage* imgjbcj = cvCreateImage(jbcjsize,img->depth,img->nChannels);
uchar *imgjbcjdata= (uchar *)imgjbcj->imageData;
int jbcjstep = imgjbcj->widthStep;
int jbcjchannels = imgjbcj->nChannels;
for(i=0;i<476;i++){
for(j=0;j<833;j++){
imgjbcjdata[i*jbcjstep+j*jbcjchannels]=data[(i+jbi)*step+(j+jbj)*channels];
}
}
//此处是yss进行注释没发现有什么用处
for(i=0;i<476;i=i+2){
imgjbsbdata[(i+jbi)*step+jbj*channels]=0;
imgjbsbdata[(i+jbi)*step+(jbj+833)*channels]=0;
}
for(j=0;j<833;j=j+2){
imgjbsbdata[jbi*step+(j+jbj)*channels]=0;
imgjbsbdata[(jbi+476)*step+(j+jbj)*channels]=0;
}
return imgjbcj;
}