• 自动分区


    今天继续处理识别模块

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

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

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

    先把工具栏调整一下。

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

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

    自欺欺人哈。

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

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

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

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

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

  • 相关阅读:
    对JAVA集合进行遍历删除时务必要用迭代器
    设计模式之单例模式(线程安全)
    List、Set、Map 和 Queue 之间的区别
    HashMap和Hashtable的区别
    Java WeakReference的理解与使用
    Java 理论与实践: 正确使用 Volatile 变量
    java中volatile关键字的含义
    最近5年183个Java面试问题列表及答案[最全]
    淘宝一月上钻是这样操作的
    Revit API找到风管穿过的墙(当前文档和链接文档)
  • 原文地址:https://www.cnblogs.com/drgraph/p/3068007.html
Copyright © 2020-2023  润新知