19,468
社区成员
发帖
与我相关
我的任务
分享
//////////////////////////////////////////////////////////////////////////
//判断轮廓是不是一个圆,通过轮廓的面积pi*r*r的差异,判断是不是圆。
//contour:输入轮廓
//minRadius: 半径长度至少大于minRadius
//////////////////////////////////////////////////////////////////////////
BOOL isCircleContour(vector<Point>& contour,double minRadius)
{
BOOL isCircle = FALSE;
//double perimeter = arcLength(contour,TRUE);
double perimeter = arcLength(contour,FALSE);
double perimeter2 = arcLength(contour,TRUE);
Rect rect =boundingRect(contour);
double r = (rect.width+rect.height)/4.0; //半径约等于轮廓外接矩的边长/2
double area=contourArea(contour);
double pi=3.1415926;
//cout<<"x/y/width/height\t"<<rect.x<<" "<<rect.y<<" "<<rect.width<<" "<<rect.height<<endl;
//cout<<"perimeter:FALSE\t"<<perimeter<<endl;
//cout<<"perimeter2:TRUE\t"<<perimeter2<<endl;
//cout<<"area:\t"<<area<<endl;
//cout<<"r: "<<r<<" 计算出周长: "<<2*pi*r<<" 计算出面积: "<<pi*r*r<<endl;
double perimeterDiffRatio = fabs(2*pi*r - perimeter)*2.0/(2*pi*r + perimeter) *100;
double areaDiffRatio = fabs(pi*r*r - area)*2.0/(pi*r*r + area) *100;
double sideDiffRatio = abs(rect.width-rect.height)*2.0/(rect.width+rect.height)*100;
//CString CstrInfo3;
//CstrInfo3.Format(_T(" perimeterDiffRatio: %f\n areaDiffRatio: %f \n sideDiffRatio:%f"),perimeterDiffRatio,areaDiffRatio,sideDiffRatio);
//AfxMessageBox(CstrInfo3);
if (r>minRadius)
{
cout<<"周长差异百分比: "<<perimeterDiffRatio<<"%"<<endl;;
cout<<"面积差异百分比: "<<areaDiffRatio<<"%"<<endl;
cout<<"边长差异百分比: "<<sideDiffRatio<<"%"<<endl;;
cout<<endl<<endl;
}
//原始的
//const double areaDiffThresh = 18.0; //目前统计的,最大的面积差2.58%
//const double perimeterDiffThresh = 15; //目前统计的,最大的周长差5.65%
//const double sideDiffThresh = 15; //目前统计的,最大的边长差7.3%
//const double avgDiffThresh = 15.0; //三个差异比值的加权平均要求小于5.0;
const double areaDiffThresh = 5; //目前统计的,最大的面积差2.58%
const double perimeterDiffThresh =7.25; //目前统计的,最大的周长差5.65%
const double sideDiffThresh = 10; //目前统计的,最大的边长差7.3%
const double avgDiffThresh = 5.0; //三个差异比值的加权平均要求小于5.0;
double avdDiffRatio = (areaDiffRatio+perimeterDiffRatio+sideDiffRatio)/3.0;
//计算出的轮廓周长是半径的2*pi倍数
if( (areaDiffRatio <areaDiffThresh)
&& (perimeterDiffRatio <perimeterDiffThresh)
&& (sideDiffRatio <sideDiffThresh)
&&(avdDiffRatio<avgDiffThresh)
&& (r>minRadius) )
{
isCircle = TRUE;
}
return isCircle;
}
VB实现OCR文字识别
原理: 利用微软OCR控件, 只需要不到10行代码就能够实现自已的OCR文字识别软件.
1. 添加控件,需要安装office2003, 没有安装office2003的可以从别人机子上拷贝相关文件,注册regsvr32.exe mdivwctl.dll,
控件一般在这个目录下:C:\Program Files\Common Files\Microsoft Shared\MODI\11.0, 只需要相关的几个文件就可以了, 此文件夹全部文件大概在21M左右.
工程->部件->添加这个控件:Microsoft Office Document Imaging 11.0 Type Library
2.在按钮的Click事件里:
Dim strLayoutInfo As String, strLPN As String
'初始化并加载文档
Set miDoc = CreateObject("MODI.Document") '创建对象
miDoc.Create "D:\未命名.tif" '加载图片文件(必须是黑白二值图)
Screen.MousePointer = vbHourglass '设置光标忙
'识别
miDoc.Images(0).OCR miLANG_CHINESE_SIMPLIFIED, True, True '有用的就此一句,识别为中文简体
Set modiLayout = miDoc.Images(0).Layout '读出数据
strLayoutInfo = _
"Language: " & modiLayout.Language & vbCrLf & _
"Number of characters: " & modiLayout.NumChars & vbCrLf & _
"Number of fonts: " & modiLayout.NumFonts & vbCrLf & _
"Number of words: " & modiLayout.NumWords & vbCrLf & _
"Beginning of text: " & Left(modiLayout.Text, 50) & vbCrLf & _
"First word of text: " & modiLayout.Words(0).Text
MsgBox strLayoutInfo, vbInformation + vbOKOnly, "Layout Information"
Set modiLayout = Nothing
Set miDoc = Nothing
Screen.MousePointer = vbDefault
3. OK了, 是不是很简单