精华内容
下载资源
问答
  • 很好用的文字 识别 用了那么多 还是这个好用F4就能框选 直接使用会生成一个TXT文件, 文件体积小 打开后 默认后台 不占用资源,
  • windows客户端 ocr文字扫描软件,识别准确性高,支持图片框选,免费使用,图片转文字,框选文字转文本
  • 天若OCR文字识别

    2019-04-30 15:46:33
    吾爱破解论坛网友“天若幽心”制作维护的工具,是我用过的最方便的文字识别...按F4键框选需要识别的文字,即可返回文字识别结果。 设置里可以设定分行、快捷键,还有简单的文字编辑器。 同时还有翻译模式,自行研究吧。
  • 具体使用的方法也很简单,打开软件后,按F4键,框选识别文字的区域,软件便会识别该区域文字。这个F4键是可以修改的,具体大家去设置里研究吧。需要注意的是,软件运行需要.net框架。 ps:如果出现无法识别的情况...
  • 天若OCR文字识别V3.0

    2018-04-13 16:50:36
    天若OCR文字识别V3.0,F4框选需要识别的文字,正确率达到99%,软件体积小巧,使用方便。
  • 具体使用的方法也很简单,打开软件后,按F4键,框选识别文字的区域,软件便会识别该区域文字。这个F4键是可以修改的,具体大家去设置里研究吧。需要注意的是,软件运行需要.net框架。当然,如果你使用的是系统迷的...
  • vs2015+OpenCV4.0图形文字轮廓的生成(注意:程序是64位exe,32位机器不支持运行!) 核心代码部分 : #include<opencv2/opencv.hpp> //4.0 头文件 #include<opencv2\imgproc\types_c.h> //4.0 ...

    vs2015+OpenCV4.0图形文字轮廓的生成(注意:程序是64位exe,32位机器不支持运行!)

     

    核心代码部分 :

    #include<opencv2/opencv.hpp>          //4.0 头文件 
    #include<opencv2\imgproc\types_c.h>   //4.0 头文件 实现图像的 灰度 二值 腐蚀 头文件解决 未定义标识符 CV_BGR2GRAY

    #include <opencv2/core/core.hpp>      //4.0 头文件 实现图像的 膨胀
    #include <opencv2/highgui/highgui.hpp>//4.0 头文件 实现图像的 膨胀
    #include <opencv2/imgproc/imgproc.hpp>//4.0 头文件 实现图像的 膨胀
     


    void CMFCApplication1Dlg::OnBnClickedButton1() //opencv基本图像处理
    {
        using namespace cv;
        using namespace std;
        Mat matSrc = imread("D:/捕获.JPG");
        imshow("显示原图", matSrc);
        //waitKey(0);
        //destroyAllWindows();


        //2 把原图转成灰度图
        Mat matGray;
        cvtColor(matSrc, matGray, CV_BGR2GRAY);
        //2 显示灰度图
        namedWindow("显示灰度图", WINDOW_NORMAL);
        imshow("显示灰度图", matGray);
        imwrite("显示灰度图.jpg", matGray);

        //3 把灰度图二值化
        Mat matBinary;
        threshold(matGray, matBinary, 128, 255, THRESH_BINARY);
        //3 显示二值图
        namedWindow("显示二值图", WINDOW_NORMAL);
        imshow("显示二值图", matBinary);
        imwrite("显示二值图.jpg", matBinary);

        //4 腐蚀
        Mat matResult;
        Mat element = getStructuringElement(MORPH_RECT, Size(17, 17));//创建17x17的核
        erode(matBinary, matResult, element);

        //4 显示腐蚀
        namedWindow("显示腐蚀", WINDOW_NORMAL);
        imshow("显示腐蚀", matResult);
        imwrite("显示腐蚀图.jpg", matResult);
        

        //5 进行膨胀操作 
        Mat out;
        Mat elements = getStructuringElement(MORPH_RECT, Size(15, 15));
        dilate(matResult, out, elements);

        //显示效果图     
        namedWindow("显示膨胀");
        imshow("显示膨胀", out);
        imwrite("显示膨胀图.jpg", out);
        
    }

    void CMFCApplication1Dlg::OnBnClickedButton2() //opencv图像文字提取和框选处理
    {
        using namespace cv;
        using namespace std;
        Mat matSrc = imread("D:/捕获.JPG");
        //imshow("显示原图", matSrc);
        //waitKey(0);
        //destroyAllWindows();


        //2 把原图转成灰度图
        Mat matGray;
        cvtColor(matSrc, matGray, CV_BGR2GRAY);
        //2 显示灰度图
        //namedWindow("显示灰度图", WINDOW_NORMAL);
        //imshow("显示灰度图", matGray);


        //00000000000000000000000000000000000000000000000000000000000000000000000000

        Mat gray;
        cvtColor(matSrc, gray, CV_BGR2GRAY);
        //imshow("matSrc", gray);

        //2.形态学变换的预处理,得到可以查找矩形的轮廓


        //1.Sobel算子,x方向求梯度
        Mat sobel;
        Sobel(gray, sobel, CV_8U, 1, 0, 3);
        //2.二值化
        Mat binary;
        threshold(sobel, binary, 0, 255, THRESH_OTSU + THRESH_BINARY);
        //3.膨胀和腐蚀操作核设定
        Mat element1 = getStructuringElement(MORPH_RECT, Size(30, 9));
        //控制高度设置可以控制上下行的膨胀程度,例如3比4的区分能力更强,但也会造成漏检
        Mat element2 = getStructuringElement(MORPH_RECT, Size(24, 4));

        //4.膨胀一次,让轮廓突出
        Mat dilate1;
        dilate(binary, dilate1, element2);
        //5.腐蚀一次,去掉细节,表格线等。这里去掉的是竖直的线
        Mat erode1;
        erode(dilate1, erode1, element1);
        //6.再次膨胀,让轮廓明显一些
        Mat dilate2;
        dilate(erode1, dilate2, element2);
        //7.存储中间图片
        imwrite("binary.jpg", binary);
        imwrite("dilate1.jpg", dilate1);
        imwrite("erode1.jpg", erode1);
        imwrite("dilate2.jpg", dilate2);

        //以上代码没问题,可以实现图形的预处理

        vector<vector<Point>>contours;
        vector<Vec4i>hierarchy;
        findContours(dilate2, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
        //绘制轮廓图
        Mat::zeros(dilate2.size(), CV_8UC3);

        for (int i = 0; i < hierarchy.size(); i++)
        {
            Scalar color = Scalar(rand() % 255, rand() % 255, rand() % 255);
            //drawContours(dilate2, contours, i, color, CV_FILLED, 8, hierarchy);
            drawContours(matSrc, contours, i, cv::Scalar(0, 0, 255), 2, 8, hierarchy, 1, Point(0, 0));// 0,255,0 绿色 255,0,0 蓝色 0,0,255 红色
        }
        imshow("轮廓图", matSrc);
        imwrite("轮廓图.jpg", matSrc);
    }

    程序运行效果如下

     

    1.0源码版本下载地址:

    https://download.csdn.net/download/blackangelboy/12157111

     

     

    以下是2.0源码版本的运行效果!有兴趣的可以下载2.0完善版本的!

     

    2.0源码版本下载地址:

    https://download.csdn.net/download/blackangelboy/12158766

    源码部分代码来自网络,请勿商用!

    有开发需求可联系我,定制开发智能识别算法!

    扫码直接加我微信,一起探讨智能识别技术!

     

    opencv库类设置方法:

    详细参考请到:https://blog.csdn.net/qq_39987952/article/details/90700277

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 思路 主要实现: Ocr:提取本地图片中的文本...将快捷键设为QQ的截图快捷键有一个好处就是可以随意框选区域。 具体实现 python3.8及以上 from aip import AipOcr from PIL import ImageGrab import keyboard import t

    思路

    主要实现:

    • Ocr:提取本地图片中的文本并以txt格式保存备用
    • Screenshot:同时按下Ctrl+Alt+A触发截图和保存,按下ESC后提取剪贴板中图片内的文字并保存备用

    理论上可以每天处理5万张图片,实际运行会受到网速、识别率等各种因素的影响。
    将快捷键设为QQ的截图快捷键有一个好处就是可以随意框选区域。

    具体实现

    python3.8及以上

    from aip import AipOcr
    from PIL import ImageGrab
    import keyboard
    import time
    import os
    
    APP_ID = '****'
    API_KEY = '****'
    SECRET_KEY = '****'
    client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    
    
    class Ocr:
        def __init__(self):
            self.image_path = None
            self.text_path = None
            self.text_dict = None
            self.original_basename = None
            self.number_lines = None
            self.result_dir = r'C:\Users\Administrator\Documents\BaiDu Ocr'
    
        def __str__(self):
            return _ if type(_ := self.text_dict) is str else '\n'.join(i['words'] for i in _['words_result'])
    
        def __len__(self):
            return int(_[_.find(':') + 1:_.find('\n')]) if type(_ := self.text_dict) is str else _['words_result_num']
    
        def get_original_basename(self):
            self.original_basename = f'OCR_{os.path.basename(os.path.splitext(self.image_path)[0])}_' \
                                     f'{time.strftime("%Y%m%d%H")}'
    
        def get_text(self):
            self.text_path = f'{self.result_dir}/{self.original_basename}.txt'
            if not os.path.exists(self.text_path):
                with open(self.image_path, 'rb') as f:
                    image = f.read()
                    self.text_dict = client.basicAccurate(image)
            else:
                with open(self.text_path, 'r', encoding='utf-8') as f:
                    self.text_dict = f.read()
    
        def save_text(self):
            with open(self.text_path, 'w', encoding='utf-8') as fp:
                fp.write(f'行数:{self.text_dict["words_result_num"]}\n')
                for res in self.text_dict['words_result']:
                    fp.write(f'{res["words"]}\n')
    
        def main(self):
            self.get_original_basename()
            self.get_text()
            if not os.path.exists(self.text_path):
                self.save_text()
    
    
    class Screenshot:
        def __init__(self):
            self.temporary_path = r'C:\Users\Administrator\Pictures\Screen'
            self.psc_absname = None
            self.ocr = Ocr()
    
        def print_screen(self):
            self.psc_absname = f'{self.temporary_path}/PSC_{time.strftime("%Y%m%d_%H%M%S", time.localtime())}.png'
            print('the absolute pathname of screen shot image :', self.psc_absname)
            if keyboard.wait(hotkey='ctrl+alt+a') is None:
                if keyboard.wait(hotkey='esc') is None:
                    time.sleep(0.01)
                    image = ImageGrab.grabclipboard()
                    image.save(self.psc_absname)
            else:
                print('please press the key F4 to start, then press the key ESC to stop')
    
        def psc_text(self):
            self.print_screen()
            self.ocr.image_path = self.psc_absname
            self.ocr.main()
    
    
    if __name__ == '__main__':
        ocr = Ocr()
        ocr.image_path = r'C:\Users\Administrator\Pictures\QQ浏览器截图\QQ截图20200929172715.jpg'
        ocr.main()
        print(ocr)
        # psc = Screenshot()
        # psc.psc_text()
    
    展开全文
  • AquaDesktop是一款简单实用的图片文字识别软件。这款软件可以抓取图片上的文字,快速成为文本。我们都知道在图片中的文字信息内容是无法复制的,当你需要对相关图片中的文字内容进行复制时,通常情况下是通过手打来...
  • 识别屏幕文字.rar

    2019-08-31 17:52:46
    获取图片中文字,获取pdf文件中文字,同时按住shift+f4框选图片即可快速获取图片文字
  • 使用IronOCR识别图片文字

    千次阅读 2018-05-24 17:47:12
    最近实验课要做一个图片文字识别,需求是Winform中有一个图片,进行框选后,识别框选中的内容,老师提示说去找OCR的开源库,所以我就找到了IronOCR IronOCR:The C# OCR Library : Iron OCR IronOcr makes it ...

    最近实验课要做一个图片文字识别,需求是Winform中有一个图片,进行框选后,识别框选中的内容,老师提示说去找OCR的开源库,所以我就找到了IronOCR

    IronOCR:The C# OCR Library : Iron OCR

    IronOcr makes it easy to read text from images in your .net apps & websites.

    1.Read text and barcodes from scanned images & PDFs

    2.Supports multiple international languages

    3.Output as plain text or structured data

    框选

    进行识别前,必须框选出识别区域,所以就要先去实现框选,思路就是通过MouseUpMouseMoveMouseDown三个事件去绘制一个矩形,类似于拖选

        private bool _mouseIsDown = false;
        private Rectangle _selectArea = Rectangle.Empty;
    
        private void pictureBox_MouseUp(object sender, MouseEventArgs e)
        {
            // 修正Width和Height可能为负数的问题
            if (_selectArea.Width < 0)
            {
                _selectArea.Width = -_selectArea.Width;
                _selectArea.X -= _selectArea.Width;
            }
    
            if (_selectArea.Height < 0)
            {
                _selectArea.Height = -_selectArea.Height;
                _selectArea.Y -= _selectArea.Height;
            }
    
            Cursor.Clip = Rectangle.Empty;
            _mouseIsDown = false;
            DrawRectangle();
    
            _selectArea = Rectangle.Empty;
        }
    
        private void pictureBox_MouseMove(object sender, MouseEventArgs e)
        {
            if (_mouseIsDown)
                ResizeToRectangle(e.Location);
        }
    
        /// <summary>  
        /// 初始化选择框  
        /// </summary>  
        /// <param name="startPoint"></param>  
        private void DrawStart(Point startPoint)
        {
            //指定工作区为整个控件  
            Cursor.Clip = RectangleToScreen(new Rectangle(pictureBox.Location.X, pictureBox.Location.Y,
                pictureBox.Width, pictureBox.Height));
            _selectArea = new Rectangle(startPoint.X + pictureBox.Location.X,
                startPoint.Y + pictureBox.Location.Y,1,1);
        }
        /// <summary>  
        /// 在鼠标移动的时改变选择框的大小  
        /// </summary>  
        /// <param name="p">鼠标的位置</param>  
        private void ResizeToRectangle(Point p)
        {
            _selectArea.Width = p.X + pictureBox.Location.X - _selectArea.Left;
            _selectArea.Height = p.Y + pictureBox.Location.Y - _selectArea.Top;
            DrawRectangle();
        }
        /// <summary>  
        /// 绘制选择框  
        /// </summary>  
        private void DrawRectangle()
        {
            pictureBox.Refresh();
            var rect = RectangleToScreen(_selectArea);
            ControlPaint.DrawReversibleFrame(rect, Color.White, FrameStyle.Thick);
        }

    图片文字识别

    IronOCR的使用很简单,官网给出的教程:

        using IronOcr;
        //..
        var Ocr = new AutoOcr();
        var Result = Ocr.Read(@"C:\path\to\image.png");
        Console.WriteLine(Result.Text);

    所以接下来只需要将框选区域进行截图,然后交给OCR识别即可

        private readonly AutoOcr _ocr;
        public MainForm()
        {
            InitializeComponent();
            _ocr = new AutoOcr();
    
            // 强制初始化OCR
            var img = new Bitmap(1,1);
            _ocr.Read(img);
        }
    
        // 框选的代码.......
    
        /// <summary>
        /// 识别框选的单词/句子
        /// </summary>
        /// <returns>识别的结果</returns>
        private string SelectText()
        {
            var rect = RectangleToScreen(_selectArea);
            var img = new Bitmap(rect.Width, rect.Height);
    
            var graphics = Graphics.FromImage(img);
            graphics.CompositingQuality = CompositingQuality.HighQuality;
            graphics.CopyFromScreen(rect.Left, rect.Top, 0, 0,
                new Size(rect.Width, rect.Height));
    
            var result = _ocr.Read(img);
    
            Debug.WriteLine(result.Text);
    
            return result.Text;
        }

    最后在MouseUp事件的时候调用SelectText即可,然后拿着识别出来的文字去干啥都行

    项目源码:OCRDemo

    展开全文
  • 用过Polar SI9000的都知道,阻抗模型图片可以... 鼠标点击阻抗模型图片某个像素点, 它可以实现找到离它最近的阻抗参数的文字并用红色框选出来, 还可以识别文字是哪一个阻抗参数. 二.解决方法思路 解决方法一: ...

         用过Polar SI9000的都知道,阻抗模型图片可以进行用户鼠标交互,那么它的是如何实现的呢,下面就讲一下如何实现此功能的方法

      一.看看Polar SI9000阻抗模型图片交互效果

          鼠标点击阻抗模型图片某个像素点, 它可以实现找到离它最近的阻抗参数的文字并用红色框选出来, 还可以识别文字是哪一个阻抗参数.

     

     

     二.解决方法思路

        解决方法一: 

        1.将每一种阻抗模型图片中的所有参数在图片中的位置区域信息与参数值记录到数据库中

        2.鼠标点击阻抗模型的坐标位置后,再进与数据库中的参数坐标位置匹配

        这样就可以实现与Polar阻抗软件相同的效果,但是Polar SI9000有阻抗计算模型93种,要实现的话工作量可不小,所以这种方法排除了。

        解决方法二(采用此方法实现): 

          1.找最近邻----点击像素点位置,找出离它最近的一个黑色像素点位置

          2.聚类----通过一个像素点查找周边相邻的黑色像素点进行聚类

          3.识别---截取指定区域文字图片与图像Ocr识别

     三.找最近邻----点击像素点位置,找出离它最近的一个黑色像素点位置

          1.【圈】的遍历方式按下图方式进行

             以鼠标点击像素的位置,向像素四周搜索黑色像素点,依次遍历第1圈,第2圈,第3圈.....直到找到黑色像素则终止      

           

          2.【段】的遍历方式按下图方式进行     

          

     

           3.C#代码实现,鼠标点击像素点位置,找出离它最近的黑色像素点

            /// <summary>
            /// 通过鼠标点击像素点位置,找出离它最近的一个黑色像素点位置
            /// </summary>
            /// <param name="MousePoint"></param>
            /// <param name="ArrayBitmap"></param>
            /// <returns></returns>
            private Point ArrayLoop(Point MousePoint, Bitmap ArrayBitmap)
            {
                Point ClacBlackPoint = new Point();
                Color pixel = ArrayBitmap.GetPixel(MousePoint.X, MousePoint.Y);
                if (pixel.R <= 25 && pixel.G <= 40 && pixel.B <= 60)
                {
                    return MousePoint;
                }
                Point ArraySum = new Point(ArrayBitmap.Size);
                int[,] ArrayLoopType = new int[,] { { 1, 1 }, { -1, 1 }, { -1, -1 }, { 1, -1 } }; //偏移位移矩阵数组
                int LoopLength = getArrayLoopMax(MousePoint, ArraySum);//遍历的圈数计算
                int ArayLength = ArrayLoopType.GetLength(0);//计算值为4
                for (int k = 1; k <= LoopLength; k++) //按圈遍历
                {
                    Point LoopPoint = MousePoint;
                    LoopPoint.Offset(0, -k);//更新圈的起点像素坐标
                    for (int i = 0; i < ArayLength; i++)//每圈分为4段遍历
                    {
                        for (int j = 0; j < k; j++)
                        {
                            LoopPoint.X += ArrayLoopType[i, 0];
                            LoopPoint.Y += ArrayLoopType[i, 1];
                            if (LoopPoint.X > 0 && LoopPoint.Y > 0 && LoopPoint.X <= ArraySum.X && LoopPoint.Y <= ArraySum.Y)//
                            {
                                pixel = ArrayBitmap.GetPixel(LoopPoint.X - 1, LoopPoint.Y - 1);
                                if (pixel.R <= 25 && pixel.G <= 40 && pixel.B <= 60)
                                {
                                    ClacBlackPoint = LoopPoint;
                                    goto L1;
                                }
                            }
                        }
                    }
                }
                L1:
                return ClacBlackPoint;  
            }
            /// <summary>
            /// 获取遍历圈数最大值
            /// </summary>
            /// <param name="MousePoint"></param>
            /// <param name="ArraySum"></param>
            /// <param name="LoopType"></param>
            /// <returns></returns>
            private int getArrayLoopMax(Point MousePoint, Point ArraySum, int LoopType = 1)
            {
                int LoopLength = 0;
                if (LoopType == 1)
                {
                    int TopLeft = (MousePoint.X - 1 + MousePoint.Y - 1);
                    int TopRight = (ArraySum.X - MousePoint.X + MousePoint.Y - 1);
                    int TopMax = Math.Max(TopLeft, TopRight);
                    int BootomLeft = (MousePoint.X - 1 + ArraySum.Y - MousePoint.Y);
                    int BottomRight = (ArraySum.X - MousePoint.X + ArraySum.Y - MousePoint.Y);
                    int BottomMax = Math.Max(BootomLeft, BottomRight);
                    LoopLength = Math.Max(TopMax, BottomMax);
                }
                else
                {
                    int MaxX = Math.Max(MousePoint.X - 1, ArraySum.X - MousePoint.X);
                    int MaxY = Math.Max(MousePoint.Y - 1, ArraySum.Y - MousePoint.Y);
                    LoopLength = Math.Max(MaxX, MaxY);
                }
                return LoopLength;
            }

     

      四.聚类----通过一个像素点查找周边相邻的黑色像素点进行聚类

            1.聚类实现方法按下图进行

            

           2.C#代码实现,通过一个像素点查找周边相邻的黑色像素点进行聚类为一个矩形区域

            /// <summary>
            /// 通过一个像素点查找周边相邻的黑色像素点进行聚类为一个矩形区域
            /// </summary>
            /// <param name="CalcPoint"></param>
            /// <param name="ArrayBitmap"></param>
            /// <returns></returns>
            private RangePoint RangeArea(Point CalcPoint, Bitmap ArrayBitmap)
            {
                int LoopLength = 10; //搜索周边相邻像素个数
                int[,] ArrayLoopType = new int[,] { { 1, 1 }, { -1, 1 }, { -1, -1 }, { 1, -1 } };
                Point ArraySum = new Point(ArrayBitmap.Size);
                RangePoint RangePointArea = new RangePoint(CalcPoint, CalcPoint);
                HashSet<Point> PointSet = new HashSet<Point>();
                HashSet<Point> LoopPointSet = new HashSet<Point>();
                Queue<Point> PointQueue = new Queue<Point>();
                PointQueue.Enqueue(CalcPoint);
                while (PointQueue.Count > 0)
                {
                    var TopPoint = PointQueue.Dequeue();  //TopPoint 以这个点周边范围进行搜索像素
                    for (int k = 1; k <= LoopLength; k++)
                    {
                        Point LoopPoint = TopPoint;
                        LoopPoint.Offset(0, -k);
                        for (int i = 0; i < 4; i++)
                        {
                            for (int j = 0; j < k; j++)
                            {
                                LoopPoint.X += ArrayLoopType[i, 0];
                                LoopPoint.Y += ArrayLoopType[i, 1];
                                if (!LoopPointSet.Contains(LoopPoint))
                                {
                                    LoopPointSet.Add(LoopPoint);
                                    if (LoopPoint.X > 0 && LoopPoint.Y > 0 && LoopPoint.X <= ArraySum.X && LoopPoint.Y <= ArraySum.Y)
                                    {
                                        Color pixel = ArrayBitmap.GetPixel(LoopPoint.X - 1, LoopPoint.Y - 1);
                                        if (pixel.R <= 25 && pixel.G <= 40 && pixel.B <= 60)
                                        {
                                            if (!PointSet.Contains(LoopPoint))
                                            {
                                                //找到相似的黑色像素加入队列
                                                PointQueue.Enqueue(LoopPoint);
                                                //将周边相似相素 进行扩大合并区域
                                                RangePointArea = RangePointArea.Union(LoopPoint);
                                                //加入字典
                                                PointSet.Add(TopPoint);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                return RangePointArea;
            }

    RangePoint  Mod类

        /// <summary>
        /// 范围区域点
        /// </summary>
        public class RangePoint
        {
            public RangePoint(Point MinPoint, Point MaxPoint)
            {
                RangeMinPoint = MinPoint;
                RangeMaxPoint = MaxPoint;
            }
            /// <summary>
            /// 最小点
            /// </summary>
            public Point RangeMinPoint { get; set; }
            /// <summary>
            /// 最大点
            /// </summary>
            public Point RangeMaxPoint { get; set; }
            /// <summary>
            /// 范围宽
            /// </summary>
            public int Width
            {
                get {  return this.RangeMaxPoint.X - this.RangeMinPoint.X + 1; }
            }
            /// <summary>
            /// 范围高
            /// </summary>
            public int Height
            {
                get { return this.RangeMaxPoint.Y - this.RangeMinPoint.Y + 1; }
            }
            /// <summary>
            /// 合拼区域
            /// </summary>
            /// <param name="point"></param>
            /// <returns></returns>
            public RangePoint Union(Point point)
            {
                Point minP = RangeMinPoint;
                Point MaxP = RangeMaxPoint;
                if (point.X < minP.X)
                    minP.X = point.X;
                if (point.Y < minP.Y)
                    minP.Y = point.Y;
                if (point.X > MaxP.X)
                    MaxP.X = point.X;
                if (point.Y > MaxP.Y)
                    MaxP.Y = point.Y;
                RangeMinPoint = minP;
                RangeMaxPoint = MaxP;
                return this;
            }
            /// <summary>
            /// 检测点是否在区域内
            /// </summary>
            /// <param name="point"></param>
            /// <returns></returns>
            public bool IsRangeInner(Point point)
            {
                return (RangeMinPoint.X <= point.X && RangeMinPoint.Y <= point.Y && RangeMaxPoint.X >= point.X && RangeMaxPoint.Y >= point.Y);
            }
            /// <summary>
            /// 获得区域中心点
            /// </summary>
            /// <param name="point"></param>
            /// <returns></returns>
            public Point getRangeCenterPoint()
            {
                return new Point((int)((this.RangeMinPoint.X + this.RangeMaxPoint.X) * 0.5), (int)((this.RangeMinPoint.Y + this.RangeMaxPoint.Y) * 0.5));
            }
            /// <summary>
            /// 区域偏移 扩大缩小
            /// </summary>
            /// <param name="point"></param>
            /// <returns></returns>
            public RangePoint RangeOffset(int OffsetVal)
            {
                this.RangeMinPoint = new Point(this.RangeMinPoint.X - OffsetVal, this.RangeMinPoint.Y - OffsetVal);
                this.RangeMaxPoint = new Point(this.RangeMaxPoint.X + OffsetVal, this.RangeMaxPoint.Y + OffsetVal);
                return this;
            }
        }
    View Code

     

      五.识别---截取指定区域文字图片与图像识别

          1.通过聚类识别出文本区域坐标进行图像截取,并将截取出来的图像进行图像识别转文字.

               

          2.C#代码实现,截取指定区域文字图片与图像识别

             此图像识别用Baidu它们家的Ocr API自己注册一下就能用了,另外一个Tesseract也不错的,可以自行对Ocr字体模型训练,最主要是可以实现本地不联网的情况下也可以Ocr识别

            /// <summary>
            /// 获取图片指定部分
            /// </summary>
            /// <param name="pPath">图片路径</param>
            /// <param name="pOrigStartPointX">原始图片开始截取处的坐标X值</param>
            /// <param name="pOrigStartPointY">原始图片开始截取处的坐标Y值</param>
            /// <param name="pPartWidth">目标图片的宽度</param>
            /// <param name="pPartHeight">目标图片的高度</param>
            static System.Drawing.Bitmap GetPart(Image originalImg, int pOrigStartPointX, int pOrigStartPointY, int pPartWidth, int pPartHeight)
            {
                System.Drawing.Bitmap partImg = new System.Drawing.Bitmap(pPartWidth, pPartHeight);
                System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(partImg);
                System.Drawing.Rectangle destRect = new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), new System.Drawing.Size(pPartWidth, pPartHeight));//目标位置
                System.Drawing.Rectangle origRect = new System.Drawing.Rectangle(new System.Drawing.Point(pOrigStartPointX, pOrigStartPointY), new System.Drawing.Size(pPartWidth, pPartHeight));//原图位置(默认从原图中截取的图片大小等于目标图片的大小)
                graphics.DrawImage(originalImg, destRect, origRect, System.Drawing.GraphicsUnit.Pixel);
                return partImg;
            }
           /// <summary>
            /// Baidu Ocr识别
            /// </summary>
            /// <param name="img"></param>
            /// <returns></returns>
            private string OcrGeneralBasic(Image img)
            {
                StringBuilder OcrTxt = new StringBuilder();
                string baiduAPI_ID = "baiduAPI_ID";
                string baiduAPI_key = "baiduAPI_key";
                Baidu.Aip.Ocr.Ocr OcrClient = new Baidu.Aip.Ocr.Ocr(baiduAPI_ID, baiduAPI_key);
                var byteImg = Img2Byte(img);
                var OcrResult = OcrClient.GeneralBasic(byteImg);
                var words_result = OcrResult["words_result"];
                if (words_result == null) return "";
                foreach (var item in words_result)
                {
                    OcrTxt.AppendLine(item["words"].ToString());
                }
                return OcrTxt.ToString();
            }
            /// <summary>
            /// 将Image转换成为byte[] 
            /// </summary>
            /// <param name="img"></param>
            /// <returns></returns>
            public byte[] Img2Byte(System.Drawing.Image img)
            {
                MemoryStream mstream = new MemoryStream();
                img.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp);
                byte[] byData = new Byte[mstream.Length];
                mstream.Position = 0;
                mstream.Read(byData, 0, byData.Length); mstream.Close();
                return byData;
            }

     

      六.实现效果图

              

      

      七.其它问题解决方法

         1.PictureBox控件显示图片尺寸与实际图片尺寸不一致,会造成PictureBox控件上的鼠标点击像素点位置,并不是实际图片像素点位置,这里给出2种解决方法

           方法一.在读入Bitmap图片前提前转换(缩放)图片尺寸和PictureBox控件尺寸一致

            /// <summary>
            /// 图片缩放
            /// </summary>
            /// <param name="bmp"></param>
            /// <param name="newW"></param>
            /// <param name="newH"></param>
            /// <returns></returns>
            public static Bitmap KiResizeImage(Bitmap bmp, int newW, int newH)
            {
                try
                {
                    Bitmap newBitmap = new Bitmap(newW, newH);
                    Graphics g = Graphics.FromImage(newBitmap);
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
                    g.Dispose();
                    return newBitmap;
                }
                catch
                {
                    return null;
                }
            }
    View Code

          方法二.计算PictureBox图像大小与真实图像大小的比值关系,通过鼠标点击像素位置与屏幕位置的关系,计算得鼠标真实点击的图像像素位置

            /// <summary>
            /// 鼠标移动  查看鼠标位置与实际图片和显示图片关系
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void picBox_MouseMove(object sender, MouseEventArgs e)
            {
                PictureBox  picBox = (PictureBox)sender;
                int originalWidth = picBox.Image.Width;
                int originalHeight = picBox.Image.Height;
                PropertyInfo rectangleProperty = picBox.GetType().GetProperty("ImageRectangle", BindingFlags.Instance | BindingFlags.NonPublic);
                Rectangle rectangle = (Rectangle)rectangleProperty.GetValue(picBox, null);
                int currentWidth = rectangle.Width;
                int currentHeight = rectangle.Height;
                double rate = (double)currentHeight / (double)originalHeight;
                int black_left_width = (currentWidth == picBox.Width) ? 0 : (picBox.Width - currentWidth) / 2;
                int black_top_height = (currentHeight == picBox.Height) ? 0 : (picBox.Height - currentHeight) / 2;
                int zoom_x = e.X - black_left_width;
                int zoom_y = e.Y - black_top_height;
                double original_x = (double)zoom_x / rate;
                double original_y = (double)zoom_y / rate;
                StringBuilder sb = new StringBuilder();
                sb.AppendFormat("原始尺寸{0}/{1}(宽/高)\r\n", originalWidth, originalHeight);
                sb.AppendFormat("缩放状态图片尺寸{0}/{1}(宽/高)\r\n", currentWidth, currentHeight);
                sb.AppendFormat("缩放比率{0}\r\n", rate);
                sb.AppendFormat("左留白宽度{0}\r\n", black_left_width);
                sb.AppendFormat("上留白高度{0}\r\n", black_top_height);
                sb.AppendFormat("当前鼠标坐标{0}/{1}(X/Y)\r\n", e.X, e.Y);
                sb.AppendFormat("缩放图中鼠标坐标{0}/{1}(X/Y)\r\n", zoom_x, zoom_y);
                sb.AppendFormat("原始图中鼠标坐标{0}/{1}(X/Y)\r\n", original_x, original_y);
                string InfoTxt = sb.ToString();
            }
    View Code

     

    转载于:https://www.cnblogs.com/pcbren/p/10346445.html

    展开全文
  • 2-6 CheckBox复选框

    2019-12-07 12:24:18
    text 复选框后的文字 textSize 文字大小 textColor 文字颜色 layout_below 自定义样式 bg_checkbox.xml(自定义样式文件) <selector xmlns:...> <!--复选框未被选择时的样式设置--> ...
  • Unity|单选->多选框->单选

    千次阅读 2019-06-03 15:15:58
    正常情况下,每一个图片为单选,选中以后进行OCR文字识别; 点击了删除按钮,所有的图片变为可多选状态。完成或取消删除操作后,再变为单选状态。 我们都知道控制一系列物体是否为单选的条件为<Toggle>组件的...
  • (一)人工智能股框架及经典算法简介2017.6.1 机器学习的基本流程 数据获取、特征提取、数据转换、模型训练、模型选择、模型预测。 数据获取 ...自然语言识别:Word Embedding将文字转化为数值...
  • 小编最近遇到这样一个问题,看到一些图片上,有一段很棒的话,但是尴尬的发现图片上的文字是不能复制的,只能一个字一个字打出来,你也为此而烦恼过吗?...然后你会发现图片上有字的部分都会被框选出来,在下方阴
  • Ps中的内容识别

    千次阅读 2019-05-28 09:18:42
    Ps中的内容识别 (姓名:樊文军 撰写时间:2019年5月28日) 打开ps,导入一张素材图片,快捷键:ctrl+o,在工具栏中找到快速框选工具,多边形套索...点击框选工具,并框选图片中的文字,如图所示。 ,点击左上角的...
  • 支持文档识别及框选识别、旋转校正。与同类软件相比,识别看看的识别率远高于同类软件,整体的识别率高出同类OCR软件,对于模糊及断笔、粘连的图片,也具有明显的优势。文字识别之后可以保存为TXT文本文档。经小编...
  • 移动端vin码识别

    2018-06-21 14:28:10
    Vin码(Vehicle IdentificationNumber),作为车辆的身份证,具有...此技术能自动框选在框内的汽车牌号,并对图片进行偏正剪切,无需担心因为背景复杂而无法识别。移动端扫描vin码(车架号)识别识别出vin码的技...
  • 支持手机内置相机扫描跟相册导入两种方式、支持扫描图片智能框选截图文件更方便、支持图片再编辑扫描结果更清晰、支持人工智能文字OCR自动识别效率更高结果更准确、支持几十种语言的文字翻译人工智能文字翻译更精准...
  • OCR识别赛酷文档秘书

    2013-07-18 18:05:41
    注意: 1、安装好mathtype6.0A后首先要启动word,然后选择相信mathtype的宏。...3,当文字和公式在同一行时,要避免把文字到公式区域内,防止文字无法识别。 4,目前版本还不支持矩阵,行列式识别
  • 2、选择需要操作的文字识别→买入身份识别和银行卡识别(根据自己实际需求,这个返回的比较全面,有人头像,所以选择这分开的,要是只需要信息,买通用就行) 二、下载sdk包 我使用的框架是php的,thinkphp6。下载...
  • PS - 除去水印,文字

    2020-04-13 23:15:58
    第一步: 框选文字部分 第二步: 选择 - 色彩范围 - 吸管 - 吸取文字颜色 - 颜色容差 (调大) 第三步: 选择 - 修改 - 扩展 (2像素) 第四步: 内容识别 (shift + f5) 完美去文字 ...
  • Vin码(Vehicle IdentificationNumber),作为车辆的身份证,具有...此技术能自动框选在框内的汽车牌号,并对图片进行偏正剪切,无需担心因为背景复杂而无法识别。移动端扫描vin码(车架号)识别识别出vin码的技...
  • 端到端的文本检测识别

    万次阅读 2018-05-21 18:35:27
    自ICCV 2017 澳大利亚阿德莱德大学沈春华老师组的...是目前为止第一篇提出端到端OCR文字检测+识别的文章。 文章主要3点贡献:(1)提出端到端的OCR检测+识别的框架(2)改进的ROI pooling。相比于fasterRCNN中R...
  • 说到CAD标高,相信很多CAD制图初学入门小伙伴都有所了解,那么浩辰CAD给排水软件中如何识别标高范围呢?接下来的CAD制图初学入门教程就让小编来...选择参考文字,然后框选同层同字体的其余标高文字,即可实现CAD标高识
  • 2.本工具是一类文字识别工具,主要实现将图片、扫描件和PDF等文件中的文字信息识别输出为文本格式,也可以根据用户需要对屏幕框选区域中的文字信息实现识别输出,以便于用户进一步对内容进行编辑、搜索、翻译、保存...
  • 移动端扫描vin码(车架号)识别

    千次阅读 2017-07-27 06:51:37
    Vin码(Vehicle IdentificationNumber),作为车辆的身份证,具有唯一性,不可...此技术能自动框选在框内的汽车牌号,并对图片进行偏正剪切,无需担心因为背景复杂而无法识别。 移动端扫描vin码(车架号)识别,识
  • 拍照识别即刻翻译,一键识别,一键翻译,一键分享... 3对图片进行框选翻译功能。  4百度查词功能等。 云脉慧眼更多功能,更多精彩,敬请体验。 云脉慧眼软件截图: 扫一扫下载地址: 更多活动请关注官方微博:
  • 目录标题1 环境准备2 获取屏幕位置3 指定区域屏幕截图4 文字识别5 按键识别并保存到剪贴板   在腾讯收购阅文之后,微信读书的无限卡已经不能免费看书了,这时白嫖微信读书每日一答的书币成了不错的选择。严重偏科...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 219
精华内容 87
关键字:

框选文字识别