精华内容
下载资源
问答
  • opencv opengl 手写英文字母识别

    热门讨论 2014-12-10 16:46:33
    opencv opengl 手写英文字母识别
  • OpenCV查找图片文字

    2019-10-29 17:46:05
    opencv 运用 图像形态学 找到对应文字 需要安装opencv模块 numpy模块 代码使用python3
  • 11、OpenCV生成随机数、写文字

    千次阅读 2021-01-20 13:09:47
    OpenCV生成随机数、写文字一、学习目标二、使用CV::RNG生成随机数三、在图像上书写文本四、完整代码示例 一、学习目标 学会使用OpenCV的RNG接口生成随机数 学会使用OpenCV在图像上书写文字 二、使用CV::RNG生成...

    一、学习目标

    • 学会使用OpenCV的RNG接口生成随机数
    • 学会使用OpenCV在图像上书写文字

    二、使用CV::RNG生成随机数

    在之前的教程中,我们绘制了各种几何图形,其输入参数,如坐标(cv::Point的形式)、颜色、粗细等,我们为这些参数指定了特定的值。在本教程中,我们打算为绘图参数使用随机值。此外,我们打算用大量几何图形填充图像。因为我们将以随机方式初始化它们,这个过程将是自动的,并通过使用循环来完成。

    首先,我们需要初始化一个随机数生成器对象(RNG):

    RNG rng( 0xFFFFFFFF );
    

    RNG实现了一个随机数生成器。在这个例子中,rng是一个初始值为0xFFFFFFFF的对象
    RNG类有两个构造函数:

    cv::RNG::RNG()	              // 无参构造函数
    

    和:

    cv::RNG::RNG(uint64 state)    // 有参构造函数
    

    第一种形式将state设置为一些预定义的值,在当前实现中等于232-1。第二种形式将状态设置为指定的值。如果传递state=0,构造函数将使用上面的默认值来代替,以避免由所有零组成的奇异随机数序列。

    接下来,有了随机数生成器后,我们便可以调用生成器对象的接口生成随机数:

    int min=0;
    int max=100;
    Point pt1;
    pt1.x = rng.uniform( min, max);
    pt1.y = rng.uniform( min, max);
    

    对于点pt1,其坐标值xy均为随机值。

    rng.uniform函数的原型为:

    int cv::RNG::uniform(int 	a,
    					 int 	b)	
    
    • 参数 a: 生成随机数的下边界,包含值a在内
    • 参数 b: 生成随机数的上边界,不包括值b在内

    cv::RNG::uniform函数返回[a,b)范围内均匀分布的整数随机数。该方法使用MWC算法对状态进行转换,并从范围[a, b)中返回由输入参数类型推导出的下一个指定类型的均匀分布随机数。这个函数还有另外两种重载形式,与上述函数的唯一区别就在于接受参数的类型分别为 floatdouble 类型。下面的例子说明了其中的细微差别:

    RNG rng;
    // a的值一直是0,因为参数类型为整型,[0, 1)之间的整数取值为集合{0}
    double a = rng.uniform(0, 1);
    // a1的值是区间[0, 1)之间的均匀分布的double类型的小数
    double a1 = rng.uniform((double)0, (double)1);
    // b的值是区间[0, 1)之间的均匀分布的float类型的小数
    float b = rng.uniform(0.f, 1.f);
    // c的值是区间[0, 1)之间的均匀分布的double类型的小数
    double c = rng.uniform(0., 1.);
    // 由于参数类型的歧义性,下面的代码可能会产生编译错误
    double d = rng.uniform(0, 0.999999);
    

    三、在图像上书写文本

    OpenCV提供了 cv::putText 函数作为接口,以便在图像上书写文本。其函数原型为:

    void cv::putText(InputOutputArray 	img,
    				 const String & 	text,
    				 Point 				org,
    				 int 				fontFace,
    				 double 			fontScale,	
    				 Scalar 			color,
    				 int 				thickness = 1,
    				 int 				lineType = LINE_8,
    				 bool 				bottomLeftOrigin = false)
    
    • 参数 img: 书写文本的图像
    • 参数 text: 要绘制的文本字符串
    • 参数 org: 图像中文本字符串的左下角位置
    • 参数 fontFace: 字体类型,枚举自HersheyFonts
    • 参数 fontScale: 字体比例系数乘以特定字体的基础大小
    • 参数 color: 字体的颜色
    • 参数 thickness: 用于绘制文本的线条的粗细
    • 参数 lineType: 字体的线条类型
    • 参数 bottomLeftOrigin: 当为true时,图像数据坐标原点位于左下角。否则,它在左上角

    函数cv::putText在图像中呈现指定的文本字符串,不能使用指定字体呈现的符号将被问号替换。字体的取值见下表:

    参数取值取值说明
    FONT_HERSHEY_SIMPLEX正常大小无衬线 (不知所云,下同)字体
    FONT_HERSHEY_PLAIN小号无衬线字体
    FONT_HERSHEY_DUPLEX正常大小无衬线字体(比FONT_HERSHEY_SIMPLEX更复杂)
    FONT_HERSHEY_COMPLEX正常大小的衬线字体
    FONT_HERSHEY_TRIPLEX正常大小衬线字体(比FONT_HERSHEY_COMPLEX更复杂)
    FONT_HERSHEY_COMPLEX_SMALLFONT_HERSHEY_COMPLEX的小版本
    FONT_HERSHEY_SCRIPT_SIMPLEX手写风格的字体
    FONT_HERSHEY_SCRIPT_COMPLEXFONT_HERSHEY_SCRIPT_SIMPLEX的更复杂的变体
    FONT_ITALIC斜体字体

    其中,我们常用FONT_HERSHEY_SIMPLEX字体,其它字体可以在需要的时候查询即可。
    使用实例:

    Mat src = Mat::zeros...;
    putText( src, "OpenCV forever!", Size(100,100), FONT_HERSHEY_COMPLEX, 
             3,Scalar(255, 255, 255), 5, LINE_8);
    

    在某些应用中,我们可能需要搭配 cv::getTextSize 函数使用,其原型为:

    Size cv::getTextSize(const String & 	text,
    					 int 				fontFace,
    					 double 			fontScale,
    					 int 				thickness,
    					 int * 				baseLine)	
    
    • 参数 text: 输入文本字符串
    • 参数 fontFace: 使用的字体
    • 参数 fontScale: 字体比例系数乘以特定字体的基础大小
    • 参数 thickness: 文本的线条的粗细
    • 参数 baseLine: 基线相对于最底部文本点的y坐标函数

    cv::getTextSize计算并返回包含指定文本的框的大小。下面的代码实现了将文本绘制在图像的正中间,并在文本的周围紧贴了一个矩形框:

    #include<opencv2/opencv.hpp>
    using namespace cv;
    using namespace std;
    
    int main(int argc, char** argv)
    {
        // 声明和初始化要显示的文本内容
        String text = "Funny text inside the box";
    
        // 定义字体、系数和字体线条的粗细
        int fontFace = FONT_HERSHEY_SCRIPT_SIMPLEX;
        double fontScale = 2;
        int thickness = 3;
    
        // 声明并初始化一个600*800的画布,背景颜色为黑色
        Mat img(600, 800, CV_8UC3, Scalar::all(0));
    
        int baseline = 0;
        // 获取在指定文本、字体、系数和线条粗细的情况下的框体大小
        Size textSize = getTextSize(text, fontFace, fontScale, thickness, &baseline);
        baseline += thickness;
    
        // 定义文本的位置,使文本框处于画布的正中间。注意结合理解:
        // 在绘制文本时,用到的是文本框左下角的位置(不指定bottomLeftOrigin值为True的情况),要使文本框
        // 处于画布中间,则需要让文本框的左下角位置偏移文本框大小一半的尺寸,正如下面公式所示
        Point textOrg((img.cols - textSize.width) / 2, (img.rows + textSize.height) / 2);
        // 由于文本线条的粗细占用了一定像素,在考虑偏移时需要注意
        rectangle(img, textOrg + Point(0, baseline), textOrg + Point(textSize.width, -textSize.height), Scalar(0, 0, 255));
        line(img, textOrg + Point(0, thickness), textOrg + Point(textSize.width, thickness), Scalar(0, 0, 255));
        putText(img, text, textOrg, fontFace, fontScale, Scalar::all(255), thickness, 8);
    
        imshow("demo", img);
        waitKey(0);
    	system("pause");
    	return EXIT_SUCCESS;
    }
    

    在这里插入图片描述

    四、完整代码示例

    #include <opencv2/opencv.hpp>
    #include <iostream>
    using namespace cv;
    
    /// Global Variables
    const int NUMBER = 100;
    const int DELAY = 10;
    
    const int window_width = 900;
    const int window_height = 600;
    int x_1 = -window_width / 2;
    int x_2 = window_width * 3 / 2;
    int y_1 = -window_width / 2;
    int y_2 = window_width * 3 / 2;
    
    /// Function headers
    static Scalar randomColor(RNG& rng);
    int Drawing_Random_Lines(Mat image, char* window_name, RNG rng);
    int Drawing_Random_Rectangles(Mat image, char* window_name, RNG rng);
    int Drawing_Random_Ellipses(Mat image, char* window_name, RNG rng);
    int Drawing_Random_Polylines(Mat image, char* window_name, RNG rng);
    int Drawing_Random_Filled_Polygons(Mat image, char* window_name, RNG rng);
    int Drawing_Random_Circles(Mat image, char* window_name, RNG rng);
    int Displaying_Random_Text(Mat image, char* window_name, RNG rng);
    int Displaying_Big_End(Mat image, char* window_name, RNG rng);
    
    int main(int argc, char** argv)
    {
        int c;
        // 创建窗体
        char window_name[] = "Drawing_2 Tutorial";
    
        // 初始化随机数生成器
        RNG rng(0xFFFFFFFF);
        // 初始化画布为黑色背景
        Mat image = Mat::zeros(window_height, window_width, CV_8UC3);
        imshow(window_name, image);
        waitKey(DELAY);
    
        /// 在画布上随机画上线段
        c = Drawing_Random_Lines(image, window_name, rng);
        if (c != 0) return 0;
    
        /// 在画布上随机画上矩形
        c = Drawing_Random_Rectangles(image, window_name, rng);
        if (c != 0) return 0;
    
        /// 在画布上随机画上椭圆
        c = Drawing_Random_Ellipses(image, window_name, rng);
        if (c != 0) return 0;
    
        /// 在画布上随机画多边形轮廓
        c = Drawing_Random_Polylines(image, window_name, rng);
        if (c != 0) return 0;
    
        /// 在画布上随机画填充多边形
        c = Drawing_Random_Filled_Polygons(image, window_name, rng);
        if (c != 0) return 0;
    
        /// 在画布上随机画圆
        c = Drawing_Random_Circles(image, window_name, rng);
        if (c != 0) return 0;
    
        /// 在画布上随机绘制文本 Testing text rendering
        c = Displaying_Random_Text(image, window_name, rng);
        if (c != 0) return 0;
    
        /// 在画布正中间绘制文本 OpenCV forever!
        c = Displaying_Big_End(image, window_name, rng);
        if (c != 0) return 0;
    
        waitKey(0);
        return EXIT_SUCCESS;
    }
    
    // 生成随机颜色
    static Scalar randomColor(RNG& rng)
    {
        int icolor = (unsigned)rng;
        return Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255);
    }
    
    // 在画布的随机位置画随机颜色、随机粗细的线段
    int Drawing_Random_Lines(Mat image, char* window_name, RNG rng)
    {
        Point pt1, pt2;
    
        for (int i = 0; i < NUMBER; i++)
        {
            pt1.x = rng.uniform(x_1, x_2);
            pt1.y = rng.uniform(y_1, y_2);
            pt2.x = rng.uniform(x_1, x_2);
            pt2.y = rng.uniform(y_1, y_2);
    
            line(image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8);
            imshow(window_name, image);
            if (waitKey(DELAY) >= 0)
            {
                return -1;
            }
        }
        return 0;
    }
    
    // 在画布的随机位置画随机颜色、随机线条、随机粗细的矩形
    int Drawing_Random_Rectangles(Mat image, char* window_name, RNG rng)
    {
        Point pt1, pt2;
        int lineType = 8;
        int thickness = rng.uniform(-3, 10);
    
        for (int i = 0; i < NUMBER; i++)
        {
            pt1.x = rng.uniform(x_1, x_2);
            pt1.y = rng.uniform(y_1, y_2);
            pt2.x = rng.uniform(x_1, x_2);
            pt2.y = rng.uniform(y_1, y_2);
    
            rectangle(image, pt1, pt2, randomColor(rng), MAX(thickness, -1), lineType);
    
            imshow(window_name, image);
            if (waitKey(DELAY) >= 0)
            {
                return -1;
            }
        }
        return 0;
    }
    
    // 随机画椭圆
    int Drawing_Random_Ellipses(Mat image, char* window_name, RNG rng)
    {
        int lineType = 8;
    
        for (int i = 0; i < NUMBER; i++)
        {
            Point center;
            center.x = rng.uniform(x_1, x_2);
            center.y = rng.uniform(y_1, y_2);
    
            Size axes;
            axes.width = rng.uniform(0, 200);
            axes.height = rng.uniform(0, 200);
    
            double angle = rng.uniform(0, 180);
    
            ellipse(image, center, axes, angle, angle - 100, angle + 200,
                randomColor(rng), rng.uniform(-1, 9), lineType);
    
            imshow(window_name, image);
    
            if (waitKey(DELAY) >= 0)
            {
                return -1;
            }
        }
        return 0;
    }
    
    // 随机画多边形
    int Drawing_Random_Polylines(Mat image, char* window_name, RNG rng)
    {
        int lineType = 8;
    
        for (int i = 0; i < NUMBER; i++)
        {
            Point pt[2][3];
            pt[0][0].x = rng.uniform(x_1, x_2);
            pt[0][0].y = rng.uniform(y_1, y_2);
            pt[0][1].x = rng.uniform(x_1, x_2);
            pt[0][1].y = rng.uniform(y_1, y_2);
            pt[0][2].x = rng.uniform(x_1, x_2);
            pt[0][2].y = rng.uniform(y_1, y_2);
            pt[1][0].x = rng.uniform(x_1, x_2);
            pt[1][0].y = rng.uniform(y_1, y_2);
            pt[1][1].x = rng.uniform(x_1, x_2);
            pt[1][1].y = rng.uniform(y_1, y_2);
            pt[1][2].x = rng.uniform(x_1, x_2);
            pt[1][2].y = rng.uniform(y_1, y_2);
    
            const Point* ppt[2] = { pt[0], pt[1] };
            int npt[] = { 3, 3 };
    
            polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1, 10), lineType);
    
            imshow(window_name, image);
            if (waitKey(DELAY) >= 0)
            {
                return -1;
            }
        }
        return 0;
    }
    
    // 随机画填充多边形
    int Drawing_Random_Filled_Polygons(Mat image, char* window_name, RNG rng)
    {
        int lineType = 8;
    
        for (int i = 0; i < NUMBER; i++)
        {
            Point pt[2][3];
            pt[0][0].x = rng.uniform(x_1, x_2);
            pt[0][0].y = rng.uniform(y_1, y_2);
            pt[0][1].x = rng.uniform(x_1, x_2);
            pt[0][1].y = rng.uniform(y_1, y_2);
            pt[0][2].x = rng.uniform(x_1, x_2);
            pt[0][2].y = rng.uniform(y_1, y_2);
            pt[1][0].x = rng.uniform(x_1, x_2);
            pt[1][0].y = rng.uniform(y_1, y_2);
            pt[1][1].x = rng.uniform(x_1, x_2);
            pt[1][1].y = rng.uniform(y_1, y_2);
            pt[1][2].x = rng.uniform(x_1, x_2);
            pt[1][2].y = rng.uniform(y_1, y_2);
    
            const Point* ppt[2] = { pt[0], pt[1] };
            int npt[] = { 3, 3 };
    
            fillPoly(image, ppt, npt, 2, randomColor(rng), lineType);
    
            imshow(window_name, image);
            if (waitKey(DELAY) >= 0)
            {
                return -1;
            }
        }
        return 0;
    }
    
    // 随机画圆
    int Drawing_Random_Circles(Mat image, char* window_name, RNG rng)
    {
        int lineType = 8;
    
        for (int i = 0; i < NUMBER; i++)
        {
            Point center;
            center.x = rng.uniform(x_1, x_2);
            center.y = rng.uniform(y_1, y_2);
    
            circle(image, center, rng.uniform(0, 300), randomColor(rng),
                rng.uniform(-1, 9), lineType);
    
            imshow(window_name, image);
            if (waitKey(DELAY) >= 0)
            {
                return -1;
            }
        }
        return 0;
    }
    
    // 随机绘制文本
    int Displaying_Random_Text(Mat image, char* window_name, RNG rng)
    {
        int lineType = 8;
    
        for (int i = 1; i < NUMBER; i++)
        {
            Point org;
            org.x = rng.uniform(x_1, x_2);
            org.y = rng.uniform(y_1, y_2);
    
            putText(image, "Testing text rendering", org, rng.uniform(0, 8),
                rng.uniform(0, 100) * 0.05 + 0.1, randomColor(rng), rng.uniform(1, 10), lineType);
    
            imshow(window_name, image);
            if (waitKey(DELAY) >= 0)
            {
                return -1;
            }
        }
        return 0;
    }
    
    // 在画布正中间绘制文本
    int Displaying_Big_End(Mat image, char* window_name, RNG)
    {
        Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0);
        Point org((window_width - textsize.width) / 2, (window_height - textsize.height) / 2);
        int lineType = 8;
    
        Mat image2;
    
        for (int i = 0; i < 255; i += 2)
        {
            image2 = image - Scalar::all(i);
            putText(image2, "OpenCV forever!", org, FONT_HERSHEY_COMPLEX, 3,
                Scalar(i, i, 255), 5, lineType);
    
            imshow(window_name, image2);
            if (waitKey(DELAY) >= 0)
            {
                return -1;
            }
        }
        return 0;
    }
    
    

    首先,画布上开始随机绘制线条:
    在这里插入图片描述
    然后,画布上开始随机绘制矩形:
    在这里插入图片描述
    接下来,画布上随机绘制椭圆:
    在这里插入图片描述
    接下来,画布上随机绘制多边形轮廓:
    在这里插入图片描述

    接下来,画布上随机绘制填充多边形:
    在这里插入图片描述
    接下来,画布上随机绘制圆:
    在这里插入图片描述
    接下来,在画布上随机绘制文本:
    在这里插入图片描述
    最后,在画布正中间绘制文本 OpenCV forever!
    在这里插入图片描述

    展开全文
  • OpenCV python 绘制文字

    2020-02-01 12:10:25
    OpenCV python 绘制文字 import numpy as np import cv2 def main(): # 1.创建白色背景图片 d = 400 img = np.ones((d, d, 3), np.uint8) * 255 # 2.绘制文字 font = cv2.FONT_HERSHEY_SIMPLEX cv2....

    OpenCV python 绘制文字

    import numpy as np
    import cv2
    
    
    def main():
    
        # 1.创建白色背景图片
        d = 400
        img = np.ones((d, d, 3), np.uint8) * 255
        
        # 2.绘制文字
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, "OpenCV", (0, 150), font, 3, (0, 0, 255), 15)
        cv2.putText(img, "OpenCV", (0, 250), font, 3, (0, 255, 0), 15,
                    cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, True)
    
        # 3.显示结果
        cv2.imshow("img", img)
    
        cv2.waitKey()
        cv2.destroyAllWindows()
    
    
    if __name__ == '__main__':
        main()
    
    

    处理结果
    在这里插入图片描述

    展开全文
  • OpenCV:图片文字分割

    千次阅读 2018-04-10 19:37:58
    最近在做图片文字提取的一个项目,这两天有点小进展,与大家分享...opencv2/opencv.hpp&gt; #include&lt;vector&gt; #define EXPANSION_MULTIPLE 1 //图片的膨胀倍数 using namespace std; using n...
    最近在做图片文字提取的一个项目,这两天有点小进展,与大家分享一下。

    //图片文字分割,并将分割得到的图片存储到当前路径
    
    #include<opencv2/opencv.hpp>
    #include<vector>
    
    #define EXPANSION_MULTIPLE 1              //图片的膨胀倍数
    
    using namespace std;
    using namespace cv;
    
    Mat myBinarize(Mat input)            //图像阈值化
    {
    	Mat binaryImage,grayImage;            //使用OTSU界定输入图像
    	cvtColor(input, grayImage, CV_BGR2GRAY);
    	threshold(grayImage,binaryImage, 0, 255, THRESH_OTSU);
    		
    	/*
    	int size = (int)(binaryImage.size().);
    	int white = countNonZero(binaryImage);  //计算白像素的数目
    	int black = size - white;  //计算黑像素的数目
    	return white < black ? binaryImage : ~binaryImage;
    	*/
    
    	imshow("【1、阈值处理结果】", grayImage);
    
    	return binaryImage;
    }
    
    Mat delWaterMark(Mat input)                  //去水印以及二值化图片
    {
    	Mat gray1, dst, binary, gray2;
    
    	imshow("【有水印的原图】", input);
    
    	//void  cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
    	cvtColor(input, gray1, COLOR_RGB2GRAY);        //把原图转换成它的灰度图
    	
    	//double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
    	threshold(gray1, dst, 40, 255, 4);            //去水印
    	imshow("【去掉水印的图片】", dst);
    
    	threshold(dst, binary, 0, 255, 0);             //二值化
    	imshow("【二值化的图片】", binary);
    
    	return binary;
    }
    
    Mat myDilate(Mat input)       //使用膨胀使图像元素加粗,让所有字符粘在一起,创建连通区域
    {
    	Mat kernel = getStructuringElement(MORPH_CROSS,Size(3,3));     //使用3*3交叉内核
    	Mat dilated;
    	
    	dilate(input, dilated, kernel, Point(-1, -1), EXPANSION_MULTIPLE);   //以这个内核为中心膨胀8倍
    	//具体的内核大小和膨胀倍数根据实际情况而定,只要确保所有字符都粘在一起即可
    
    	imshow("【2、膨胀处理结果】",dilated);
    	return dilated;
    }
    
    
    /*
    Mat myFindContours(Mat input)                     //传入膨胀之后的图片
    {
    	vector<vector<Point>> contours;
    	
        //第一个参数是膨胀后的图像,第二个参数是用于检测轮廓向量
    	findContours(input, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);    
    	
    	imshow("【3、轮廓图】", input);
    	return input;
    }
    */
    
    Mat deskewAndCrop(Mat input, const RotatedRect& box)      //提取文本和调整文本倾斜,需读取预期的区域、角度和大小
    {
    	double angle = box.angle;       //RotatedRect类型的 box的属性有:size , center , angle
    	Size2f size = box.size;
    
    	if (angle < -45.0)             //调整框角度
    	{
    		angle += 90.0;          //角度小于45度,意味着文本是垂直对齐的,增加90度的旋转角度,交换宽度与高度属性
    		swap(size.width, size.height);
    	}
    
    	//根据角度旋转文本,先创建一个描述旋转的二维仿射变换矩阵
    	Mat transform = getRotationMatrix2D(box.center, angle, 1.0);  //参数:旋转中心,旋转角度,1.0表示保持框的原始比例不变
    	Mat rotated;
    	warpAffine(input, rotated, transform, input.size(), INTER_CUBIC);  //旋转函数
    	imshow("【旋转后的图像】",rotated);    //---------------test--------
    
    	Mat cropped;                                              //裁剪结果
    	//void getRectSubPix(InputArray image, Size patchSize, Point2f center, OutputArray patch, int patchType=-1 )
    	getRectSubPix(rotated, size, box.center, cropped);        //裁剪矩形区域的边界框
    	copyMakeBorder(cropped, cropped, 10, 10, 10, 10,BORDER_CONSTANT,Scalar(0));  //增加图像边界
    
    	return cropped;
    }
    
    
    vector<RotatedRect> findTextAreas(Mat input)
    {
    	vector<vector<Point>> contours;                                //轮廓
    	vector<RotatedRect>  area;   //RotatedRect类表示平面上的旋转矩形,有三个属性:矩形中心点(质心)、矩形大小、旋转角度
    
    
    	findContours(input, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);  //第一个参数是膨胀后的图像,第二个参数是用于检测轮廓向量
    	
    	imshow("【3、轮廓图】", input);	
    
    	for (auto contour : contours)              //在区域里遍历
    	{
    	
    		cout << "----------轮廓图中的区域遍历----test—_OK-----" << endl;
    		auto box = minAreaRect(contour);                        //找到他的旋转矩形
    
    		/*
    		if (box.size.width < 20 || box.size.height < 20)        //丢弃非常小的矩形
    		{
    			continue;
    		}
    
    		double proportion = box.angle < 45.0 ?
    			box.size.height / box.size.width :
    			box.size.width / box.size.height;
    
    		if (proportion < 2)
    		{
    			continue;
    		}
    		*/
    		area.push_back(box);
    	}
    	imshow("【旋转矩形】", input);
    	cout << "---------容器area的大小----test—OK-----" <<area.size()<<endl;
    	return area;
    }
    
    int main()
    {
    	//加载图像和图像二值化以及膨胀处理
    	
    	Mat src = delWaterMark(imread("1.png"));
    	Mat ticket = myDilate(src);
    
    	char image_name[25];                //存放图片的输出路径(即用于保存图片的路径)
    	int i = 1;                            //用于命名保存的图片
    
    	//vector<RotateRect> findTextAreas(Mat input);
    	auto regions = findTextAreas(ticket);            
    
    	
    	//每一个区域
    	for (auto& region : regions)
    	{	
    		cout << "---------进入裁剪----test—OK-----" << endl;
    		
    		//裁剪
    		auto cropped = deskewAndCrop(src, region);
    		//显示
    		imshow("【裁剪的ROI】",cropped);
    		 
    		sprintf(image_name, "%s%d%s", ".\\testImage", i++, ".jpg");    //保存的图片名 
    		imwrite(image_name, cropped);                                 //保存图片 
    	
    	}
    	
    	waitKey(0);
    	return 0;
    }
    
    

    执行效果:
    原图:
    分割得到的部分图片:

    展开全文
  • SWT C++ OPENCV 像素点文字检测 分享一下 看看和基于区域的区别有多大
  • python OpenCV:绘制文字

    2021-03-29 08:44:42
    opencv中提供了cv2.putText()函数用来在图形上面绘制文字 格式为: cv2.putText(img,text,org,fontFace,fontScale,color) 含义为: img表示要处理的图片 text表示文本内容 org表示文本的位置 fontFace表示字体...

    在进行人机交互的时候,文字是很重要的

    opencv中提供了cv2.putText()函数用来在图形上面绘制文字

    格式为:

    cv2.putText(img,text,org,fontFace,fontScale,color)
    

    含义为:
    img表示要处理的图片
    text表示文本内容
    org表示文本的位置
    fontFace表示字体类型
    fontScale表示字体大小
    color表示字体颜色

    在opencv中提供了多种字体类型,包括正常大小、小号、以及手写等风格的,只需设置相应的参数。
    部分参数展示:
    在这里插入图片描述
    代码展示:

    #pmj   2021-3-29  绘制文字
    import numpy as np
    import cv2
    img=np.ones((600,1000,3),dtype="uint8")*255
    bj=cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(img,'pmj',(0,100),bj,3,(0,255,0),15)
    cv2.putText(img,'2021-3-29',(0,300),bj,3,(0,0,255),15)
    cv2.putText(img,'python opencv word',(0,500),bj,3,(255,0,0),2)
    cv2.namedWindow('yanshi')
    cv2.imshow('yanshi',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    运行结果:
    在这里插入图片描述
    上文分享:python OpenCV:绘制一条直线
    上文分享:python OpenCV:绘制一个圆形

    如有遗漏或者错误请在评论区中指正,期待与大家的讨论!!!

    展开全文
  • Opencv + 向图像写文字

    千次阅读 2016-09-22 10:43:42
    由于一个小项目的需要,我...  系统 : windows7  环境 : vs2010+opencv-2.4.0 opencv+vs配置 ...(2)添加包含目录、库目录  (3)添加附加依赖项(.lib)  有疑问可以参考:  http://www.cnblogs.com/fre
  • opencv putText图片中写文字

    千次阅读 2015-08-05 10:42:19
    图片中写入文字#include #include <opencv2/opencv.hpp>int main(int argc, char *argv[]) { //QCoreApplication a(argc, argv); cv::Mat img; img = cv::imread("opencv.jpg"); //std::
  • opencv 轮廓提取文字

    千次阅读 2018-07-18 22:05:29
    基于轮廓提取图像文字 内容: 使用你上一篇博客图像透视变换的结果,将A4纸上的线条单独识别出来。 输入图像: 输出图像:  Python使用opencv实现 实验环境:Window下使用Python的Opencv库 通过阈值进行前后...
  • opencv-python文字识别

    2020-09-02 15:56:42
    import cv2 import numpy as np from matplotlib import pyplot as plt from PIL import Image import pytesseract img_rgb = cv2.imread('USNI.jpg') #模拟匹配,将方块以黑色填充,后面二值化就可以以过滤掉 ...
  • Android OpenCV实现文字识别
  • 主要介绍了Python+opencv 实现图片文字的分割的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • OpenCV文字区域定位

    热门讨论 2014-07-19 00:12:44
    利用OpenCV进行图片文字区域的定位和检测
  • opencv显示文字

    2020-08-05 13:31:43
    #ifndef PUTTEXT_H_ #define PUTTEXT_H_ ...opencv2/opencv.hpp> using namespace cv; void GetStringSize(HDC hDC, const char* str, int* w, int* h); void putTextZH(Mat &dst, const char* str,
  • 今天小编就为大家分享一篇对python opencv 添加文字 cv2.putText 的各参数介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 基于OpenCV的倾斜文字校正

    千次阅读 2020-04-06 16:49:55
    基于OpenCV的倾斜文字校正 使用OpenCV里example中的的倾斜文本作为输入,本文的目的即将该倾斜的文本校正成水平方向的文本。 主要思路为: 读取图像-——>Canny边缘检测——->形态学操作-——>提取最小外接...
  • OpenCV+OCR文字识别

    万次阅读 2017-06-29 16:01:29
    需配置好OpenCV和OCR环境下运行 1、opencv简介 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。 OpenCV用C++语言编写,它的主要接口也是C++语言,但是...
  • opencv-身份证文字提取

    千次阅读 2018-06-28 15:48:11
    # -*- coding: UTF-8 -*- ...import cv2 import numpy as np def get_WH(w, h): return int(w*0.63),int(h*0.8) def get_image(image): h,w = image.shape w2, h2 = get_WH(w, h) for x in range(w2...
  • OpenCV显示文字

    千次阅读 2019-04-24 08:49:05
    项目位置:OpenCV-Sample 代码位置:33-ShowText.py 代码部分: import cv2 img = cv2.imread('./res/aero3.jpg') # 照片 /添加的文字 /左下角坐标 /字体 /字体大小 /颜色 /字体粗细 cv2.putText(...
  • 基于opencv的场景文字识别

    万次阅读 热门讨论 2016-05-31 20:34:25
    项目实现:opencv3.0 + tesseract,github开源项目。 开发环境:win7 64位+Visual Studio 2012。 先上一张结果图吧: 在release版下,速度还是很快的,识别率还算可以。 实现的难点不在代码,因为早有人实现了...
  • opencv写视频并显示

    2017-03-20 17:09:50
    视频 opencv写视频并显示文字
  • OpenCV可以识别文字吗?

    千次阅读 2019-08-12 15:56:11
    OpenCV而言并不能。...要做OCR,重要的是先确定你的场景,图像来源(拍照、扫描、打印等)、文字类型(中文、英文、数字等)、版式(证件、表格、无规则 等)等等。然后确定解决思路,通用些说就是预处...
  • 使用Qt + Opencv 实现的文字识别的示例,带有文字库,学习一下没毛病
  • OpenCV部署CRNN文字识别

    2021-05-12 16:11:41
    2.github解答 二、模型转化(pytorch 转 ONNX) import torch import models.crnn as crnn model = crnn.CRNN(32, 1, 37, 256) model.load_state_dict(torch.load("crnn.pth")) dummy_input = torch.randn(1, 1, 32,...
  • 利用opencv2函数putText()在图片上写文字 #include #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat image=imread( "E:\\图片\\a9.jpg" ); ...
  • 文字:putText()函数 此函数在opencv的 imgproc 模块中的 Drawing Functions 中,同样一同存在的有:画线函数(line)、画矩形框函数(rectangle)、画圆函数(circle)等。 //函数各项参数如下 void cv::putT....
  • 基于Opencv的手写字识别

    千次阅读 2018-05-28 18:00:29
    函数介绍,以及轮廓提取和识别流程这里就不细说,详细的可以参考我的上一篇文章:使用Opencv进行轮廓检测,字符提取,简单的直方图字符识别!首先比对要有数据库图,这里我们先手几个字作为数据库模板(JPG格式)...
  • C#基于OpenCVsharp提取文字区域

    千次阅读 2020-03-27 09:49:53
    最近工作中需要用到图像文字识别,但由于图像比较大需要识别的文字比较多,所以全图识别的话效果不好,所以需要对文字区域进行检测提取,再进行识别。 功能需要用.net实现,自己对图像识别方面并不熟悉,于是上网找...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,275
精华内容 5,710
关键字:

opencv2写文字