DrGraph图形博士

导航

自动分区

今天继续处理识别模块

手动分区倒是好用,但需要用户进行一些操作,对于高级用户,或者版面比较复杂的情况,倒是可以。

但很多用户很懒的,或者说,他们最喜欢一键操作,傻瓜式的软件。

所以,需要提供自动分区功能。

先把工具栏调整一下。

先做个简单的,把语言图标找齐了。

做这个纯粹是给自己先找点感觉,感觉自己正在把软件一点点地朝好的方向做,有点成就感而已。

自欺欺人哈。

真实的原因在于,自动分区,想想都难,该如何实现呢。

先用一幅图来说吧。把这个先解决,然后再想通用的。

这应该是一个比较常见的版面,有图有真相,还有文字。

这种划分其实是图像处理中的像素操作。这里省略一万字的原理。代码如下:

    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,明天再解决下一步问题。

posted on 2013-05-08 22:58  drgraph  阅读(219)  评论(0编辑  收藏  举报