今天继续处理识别模块
手动分区倒是好用,但需要用户进行一些操作,对于高级用户,或者版面比较复杂的情况,倒是可以。
但很多用户很懒的,或者说,他们最喜欢一键操作,傻瓜式的软件。
所以,需要提供自动分区功能。
先把工具栏调整一下。
先做个简单的,把语言图标找齐了。
做这个纯粹是给自己先找点感觉,感觉自己正在把软件一点点地朝好的方向做,有点成就感而已。
自欺欺人哈。
真实的原因在于,自动分区,想想都难,该如何实现呢。
先用一幅图来说吧。把这个先解决,然后再想通用的。
这应该是一个比较常见的版面,有图有真相,还有文字。
这种划分其实是图像处理中的像素操作。这里省略一万字的原理。代码如下:
ClearRecognizeParts(false); // 清理之前自动生成的识别区域
QaImage temp(*FImage);
QaImage workImage(*FImage); // 处理拷贝workImage,原始图像FImage不变
// 清空手动分区部分的像素
RECT displayRect = TTypeConvert::Rect2RECT(FImageDisplayBounds);
CBW_ITERATOR(CbwObjects, FObjects)
if (RecognizePartType(*it) == rptManual) { /
workImage.ClearByRgn((*it)->Region, displayRect, false);
}
workImage.DoQaAdaptiveThreshold();
RECT limitedRect = TTypeConvert::Rect2RECT(TRect(0, 0, workImage.GetWidth(),
workImage.GetHeight()));
vector<RECT>rects; // 各区域块,参照坐标:图像系
int imageRectNumber = workImage.CreatePartInRectByBinWenCHEN(limitedRect,
rects); // 划分得到图像区域、各行区域
for (int i = rects.size() - 1; i >= 0; --i) { // 太小的区域块就忽略了,免得麻烦
TRect nextRect = rects[i];
if (nextRect.Width() < 15 || nextRect.Height() < 3)
rects.erase(rects.begin() + i);
}
for (unsigned int i = 0; i < rects.size(); ++i) {
TRect r = rects[i];
TCbwObject * partObject = (TCbwObject*)(*CbwBuildObjectMap)[cctRectangle]
();
AssignUItoObject(partObject);
partObject->Layer = LAYER_RECOGNIZE;
cbw::util::TCbwBrushData * data = new cbw::util::TCbwBrushData;
data->GdiBrushStyle = bsClear; // 透明画刷,便于选择操作不闪屏
data->Color1 = clRed;
partObject->BrushData = data;
delete data;
TCbwPenData * penData = new TCbwPenData;
*penData = *(partObject->PenData); // 虚线边框,好看些
penData->Style = psDot;
partObject->PenData = penData;
delete penData;
partObject->AddPoint
(TCbwFloatPoint(FImageDisplayBounds.left / Ratio + r.left,
FImageDisplayBounds.top / Ratio + r.top));
partObject->AddPoint
(TCbwFloatPoint(FImageDisplayBounds.left / Ratio + r.right,
FImageDisplayBounds.top / Ratio + r.bottom));
AddThisObject(partObject);
partObject->Tag += (int(i) < imageRectNumber ? 2 : 0) * 2; // 缺省为文字类型
if (!languageFlag) // 缺省为中文简体
partObject->Tag += Button_Language_CHINESE_SIMPLIFIED->Tag * 32;
Button_ClearAllParts->Enabled = true;
}
RefreshCurrentScreen();
实现结果:
已初步实现图片与文字区块划分。
实现这一步,并调通,花了五个小时。OK,明天再解决下一步问题。