/*
* preprocessing.c
*
*
* Created by damiles on 18/11/08.
* Copyright 2008 __MyCompanyName__. All rights reserved.
*
*/
#include "preprocessing.h"
#include "g_point.h"
#ifdef _CH_
#pragma package <opencv>
#endif
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#endif
#include<iostream>
#include<cmath>
#include<list>
using namespace std;
#define INIT 0 //表示该点还未经过探测
#define SEED 1 //表示该点为种子点,每一个符合条件的点都会被作为种子点
#define CONT 2 //表示该点已经经过探测符合生长要求
#define INVAL 3 //表示该点经过探测不符合生长要求
/*********************************
函数名: PrintMat(CvMat *matrix)
函数输入:matrix指针 数据类型opencv规定的任意一个
函数作用:在屏幕上打印矩阵
**********************************/
void PrintMat(CvMat *matrix, bool save_or_show, FILE *fp)
{
int i = 0;
int j = 0;
for (i = 0; i < matrix->rows; i++)//行
{
if (save_or_show)
{
fprintf(fp, "\n");
}
else
{
printf("\n");
}
switch (matrix->type & 0X07)
{
case CV_32F:
case CV_64F:
{
for (j = 0; j<matrix->cols; j++)//列
{
if (save_or_show)
{
fprintf(fp, "%9.3f ", (float)cvGetReal2D(matrix, i, j));
}
else
{
printf("%9.3f ", (float)cvGetReal2D(matrix, i, j));
}
}
break;
}
case CV_8U:
case CV_16U:
{
for (j = 0; j<matrix->cols; j++)
{
printf("%6d ", (int)cvGetReal2D(matrix, i, j));
if (save_or_show)
{
fprintf(fp, "%6d ", (int)cvGetReal2D(matrix, i, j));
}
else
{
printf("%6d ", (int)cvGetReal2D(matrix, i, j));
}
}
break;
}
default:
break;
}
}
}
/***********************************************
函数名: GetSplitXList(IplImage* imgSrc)
函数输入:imgSrc:待拆分的图像信息
函数作用:根据传入的图像查找该图像需要拆分的区间
************************************************/
list<int> GetSplitXList(IplImage* imgSrc)
{
list<int> xList;
int i;
bool insert = true;
int j = 0;
CvMat data;
CvScalar maxVal = cvRealScalar(imgSrc->width * 255);//单通道 128*255 CvScalar的 四个值分别为 val[0]=32640 val[0]=0 val[0]=0 val[0]=0
CvScalar val = cvRealScalar(0);
for (i = 0; i< imgSrc->width; i++)
{
cvGetCol(imgSrc, &data, i);//找到imgSrc图像信息矩阵的第i列 用data的地址指向它 data 1列128行
val = cvSum(&data);//对这一列数据
if (i == imgSrc->width - 1)
{
if (val.val[0] < maxVal.val[0] && !insert)
{
xList.insert(xList.end(), i);
j++;
break;
}
}
if (val.val[0] < maxVal.val[0] && insert)
{
xList.insert(xList.end(), i);
j++;
insert = false;
continue;
}
if (val.val[0] < maxVal.val[0] && !insert)
{
continue;
}
if (val.val[0] = maxVal.val[0] && !insert&&j % 2 == 1)
{
i -= 2;
insert = true;
}
if (val.val[0] = maxVal.val[0] && !insert&&j % 2 == 0)
{
insert = true;
}
}
return xList;
}
/***********************************************
函数名: GetSplitYList(IplImage* imgSrc)
函数输入:imgSrc:待拆分的图像信息
函数作用:根据传入的图像查找该图像需要拆分的Y区间
************************************************/
list<int> GetSplitYList(IplImage* imgSrc)
{
list<int> yList;
int i;
bool insert = true;
int j = 0;
CvMat data;
CvScalar maxVal = cvRealScalar(imgSrc->height * 255);//单通道 128*255 CvScalar的 四个值分别为 val[0]=32640 val[0]=0 val[0]=0 val[0]=0
CvScalar val = cvRealScalar(0);
for (i = 0; i< imgSrc->height; i++)
{
cvGetRow(imgSrc, &data, i);//找到imgSrc图像信息矩阵的第i列 用data的地址指向它 data 1列128行
val = cvSum(&data);//对这一列数据
if (i == imgSrc->height - 1)
{
if (val.val[0] < maxVal.val[0] && !insert)
{
yList.insert(yList.end(), i);
j++;
break;
}
}
if (val.val[0] < maxVal.val[0] && insert)
{
yList.insert(yList.end(), i);
j++;
insert = false;
continue;
}
if (val.val[0] < maxVal.val[0] && !insert)
{
continue;
}
if (val.val[0] = maxVal.val[0] && !insert&&j % 2 == 1)
{
i -= 2;
insert = true;
}
if (val.val[0] = maxVal.val[0] && !insert&&j % 2 == 0)
{
insert = true;
}
}
return yList;
}
/*************************************************************************************************
函数名: findX(IplImage* imgSrc,int* min, int* max)
函数输入:imgSrc:待查找的图像信息 min:所有有有图像像素点x的最小值 max:所有有有图像像素点x的最大值
函数作用:根据传入的图像查找该图像有笔记的x的最小区间
*************************************************************************************************/
void findX(IplImage* imgSrc, int* min, int* max)
{
int i;
int minFound = 0;
CvMat data;
CvScalar maxVal = cvRealScalar(imgSrc->width * 255);//单通道 128*255 CvScalar的 四个值分别为 val[0]=32640 val[0]=0 val[0]=0 val[0]=0
CvScalar val = cvRealScalar(0);
//For each col sum, if sum < width*255 then we find the min
//then continue to end to search the max, if sum< width*255 then is new max
for (i = 0; i< imgSrc->width; i++)
{
cvGetCol(imgSrc, &data, i);//找到imgSrc图像信息矩阵的第i列 用data的地址指向它 data 1列128行
val = cvSum(&data);//对这一列数据
if (val.val[0] < maxVal.val[0])
{
*max = i;
if (!minFound)
{
*min = i;
minFound = 1;
}
}
}
}
void FindX(CvMat *imgsrc, int *min, int *max)
{
int i;
int minFound = 0;
CvMat data;
CvScalar maxVal = cvRealScalar(imgsrc->rows * 255);//单通道 128*255 CvScalar的 四个值分别为 val[0]=128*255 val[0]=0 val[0]=0 val[0]=0
CvScalar val = cvRealScalar(0);
//For each col sum, if sum < width*255 then we find the min
//then continue to end to search the max, if sum< width*255 then is new max
for (i = 0; i< imgsrc->cols; i++)
{
cvGetRow(imgsrc, &data, i);
val = cvSum(&data);
if (val.val[0] < maxVal.val[0])
{
*max = i;
if (!minFound)
{
*min = i;
minFound = 1;
}
}
}
}
/*************************************************************************************************
函数名: findY(IplImage* imgSrc,int* min, int* max)
函数输入:imgSrc:待查找的图像信息 min:所有有有图像像素点y的最小值 max:所有有有图像像素点y的最大值
函数作用:根据传入的图像查找该图像有笔迹的y的最小区间
*************************************************************************************************/
void findY(IplImage* imgSrc, int* min, int* max)
{
int i;
int minFound = 0;
CvMat data;
CvScalar maxVal = cvRealScalar(imgSrc->height * 255);//单通道 128*255 CvScalar的 四个值分别为 val[0]=128*255 val[0]=0 val[0]=0 val[0]=0
CvScalar val = cvRealScalar(0);
//For each col sum, if sum < width*255 then we find the min
//then continue to end to search the max, if sum< width*255 then is new max
for (i = 0; i< imgSrc->height; i++)
{
cvGetRow(imgSrc, &data, i);
val = cvSum(&data);
if (val.val[0] < maxVal.val[0])
{
*max = i;
if (!minFound)
{
*min = i;
minFound = 1;
}
}
}
}
void FindY(CvMat *imgsrc, int *min, int *max)
{
int i;
int minFound = 0;
CvMat data;
CvScalar maxVal = cvRealScalar(imgsrc->cols * 255);//单通道 128*255 CvScalar的 四个值分别为 val[0]=128*255 val[0]=0 val[0]=0 val[0]=0
CvScalar val = cvRealScalar(0);
//For each col sum, if sum < width*255 then we find the min
//then continue to end to search the max, if sum< width*255 then is new max
for (i = 0; i< imgsrc->rows; i++)
{
cvGetRow(imgsrc, &data, i);
val = cvSum(&data);
if (val.val[0] < maxVal.val[0])
{
*max = i;
if (!minFound)
{
*min = i;
minFound = 1;
}
}
}
}
/***************************************************************
函数名: findBB(IplImage* imgSrc)
函数输入:imgSrc:待查找的图像信息
函数作用:根据传入的图像查找该图像有