精华内容
下载资源
问答
  • OpenCV中文乱码问题

    千次阅读 2019-02-10 09:13:54
    原文出处: https://blog.xugaoxiang.com/ai/opencv-chinese.html 软硬件环境 ubuntu 18.04 64bit ...opencv中的cv2.putText方法可以将字符显示出来,不过遗憾的是,显示中文时会出现乱码。putText方法只支持a...

    原文出处: https://xugaoxiang.com/2019/12/10/opencv-zh/

    软硬件环境

    • ubuntu 18.04 64bit
    • anaconda with python 3.6
    • opencv 3.1.0
    • Pillow 3.4.2

    问题

    opencv中的cv2.putText方法可以将字符显示出来,不过遗憾的是,显示中文时会出现乱码。putText方法只支持ascii中的一个很小的子集,而不是unicode或者是utf字符。找了找源码,可以看出一点端倪/home/xugaoxiang/anaconda3/pkgs/opencv3-3.1.0-py36_0/include/opencv2/core.hpp,其它环境路径会有差异,可以通过文件名来查找。默认情况下,opencv使用的是`hershey`这种字体,而且不支持自定义字体。

    //! Only a subset of Hershey fonts
    //! <http://sources.isc.org/utils/misc/hershey-font.txt> are supported
    enum HersheyFonts {
        FONT_HERSHEY_SIMPLEX        = 0, //!< normal size sans-serif font
        FONT_HERSHEY_PLAIN          = 1, //!< small size sans-serif font
        FONT_HERSHEY_DUPLEX         = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
        FONT_HERSHEY_COMPLEX        = 3, //!< normal size serif font
        FONT_HERSHEY_TRIPLEX        = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
        FONT_HERSHEY_COMPLEX_SMALL  = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
        FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
        FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
        FONT_ITALIC                 = 16 //!< flag for italic font
    };
    

    代码实践

    既然官方不支持,我们就找其它的方法,图片处理的话,第一感觉就是能不能用Pillow这个库,果然经过一番的查找资料(详细的请见参考资料),把乱码的问题给解决了。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Date    : 2018-08-15 14:05:21
    # @Author  : xugaoxiang (djstava@gmail.com)
    # @Link    : link
    # @Version : 1.0.0
    
    # -*- coding: utf-8 -*-
    
    import cv2
    import numpy
    from PIL import Image, ImageDraw, ImageFont
     
    if __name__ == '__main__':
     
        # opencv 读取本地图片文件, 数据类型是numpy.ndarray
        img_OpenCV = cv2.imread('dj.jpeg')
    
        # 将opencv图像格式转换成PIL格式, 数据类型是PIL.Image.Image
        img_PIL = Image.fromarray(cv2.cvtColor(img_OpenCV, cv2.COLOR_BGR2RGB))
     
        # 字体,默认的路径/usr/share/fonts/opentype/noto/NotoSansCJK-Black.ttc,我把它拷贝过来了
        font = ImageFont.truetype('NotoSansCJK-Black.ttc', 26)
        # 字体颜色
        fillColor = (0,0,255)
        # 文字输出位置
        position = (50,50)
        # 输出内容
        str = '\t\t\t\t\t\t\t\t\t\t\t\t我的独立博客: \nhttps://xugaoxiang.com'
     
        draw = ImageDraw.Draw(img_PIL)
        draw.text(position, str, font=font, fill=fillColor)
     
        # 转换回OpenCV格式
        img_OpenCV = cv2.cvtColor(numpy.asarray(img_PIL),cv2.COLOR_RGB2BGR)
    
        # 在窗口中显示
        cv2.imshow("image",img_OpenCV)
    
        while True:
            key = cv2.waitKey(1) & 0xFF
    
            if key == ord('q'):
    	        break
    
        cv2.destroyAllWindows()
    

    执行效果如下

    cv_zh

    参考资料

    公众号

    在这里插入图片描述

    展开全文
  • opencv c++ 乱码

    千次阅读 2012-04-28 14:33:22
    #include <opencv2/highgui/highgui.hpp> using namespace cv; int main(int argc,char *argv) { VideoCapture vido(0); if(!vido.isOpened()) { std::cout!"; } Mat frame; string wn("show"); ...

    无论选择 unicode 还是 Use Multi-Byte Character Set

     debug 版本,显示图片的窗口的标题总是不正确

    而release 版本则正确。何解?

     

     

    #include <iostream>
    #include <string>
    #include <opencv/cv.h>
    #include <opencv2/highgui/highgui.hpp>
    using namespace cv;
    int main(int argc,char *argv)
    {
    	VideoCapture vido(0);
    	if(!vido.isOpened())
    	{
    	std::cout<<"Can not open camera!"<<std::endl;
    	}
    	Mat frame;
    	string wn("show");
    	std::cout<<wn<<std::endl;
    	while(vido.isOpened())
    	{
     	vido>>frame;
    	imshow(wn,frame);//显示
    	if(cvWaitKey(30)==27)
    	{
    		return 0;
    	
    	}
    }
    return 0;
    }


    debug 版本设置《Use Unicode Character Set》,和显示结果

    运行结果

     

    debug 版本设置《Use Multi-Byte Character Set》,和显示结果

     

     

    运行结果:

     

     

    release 版本则 Multi-Byte Character 或者 unicode 都正确

    结果如下图

     

     

    展开全文
  • opencv putText中文乱码

    2021-09-17 14:58:28
    https://mangoroom.cn/opencv/opencv-puttext-chinese-characters.html ...opencv不支持渲染中文字符的本质是不支持对utf-8的字符渲染,opencv库中的cv::putText()函数仅支持对ascii码,这是一个很小的字符编码,想要

    https://mangoroom.cn/opencv/opencv-puttext-chinese-characters.html

    https://stackoverflow.com/questions/45116828/opencv-cvaddtext-exception-if-no-window

    opencv不支持渲染中文字符的原由
    opencv不支持渲染中文字符的本质是不支持对utf-8的字符渲染,opencv库中的cv::putText()函数仅支持对ascii码,这是一个很小的字符编码,想要支持中文或者其他字符的渲染就需要支持Unicode的字符集。其实早期的opencv是字符Unicode的字符渲染的,在c语言版本时代采用的是FreeType库实现的,但由于FreeFype是GPL版权发布的库,和OpenCV版权并不一致,因此目前还没有合并到OpenCV

    解决方法:

    编译opencv的时候,勾选wiht Qt的选项,因为Qt的渲染是支持Unicode字符集的,所以在编译opencv的时候联合编译qt的部分代码可以实现对Unicode的支持。将qt添加到opencv里一起编译本是一件比较麻烦的事,所幸的是opencv官方已经替我们解决了,已经将此选项写在了cmake的构建文件里。所以在编译的时候只需要我们勾选即可。而且在qt的官网可以找到编译教程,教程地址:
    https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows

    简单地说,参考教程,只需要在编译opencv的时候,勾选以下两个选项即可

    WITH_QT
    WITH_OPENGL

    Mat img = imread("lena.jpg");
    cv::addText(img, "中文测试", cv::Point(100, 50), cv::fontQt("Times"));
    imwrite("res.bmp", img);

    /home/vitaly/CLionProjects/opencvTest/cmake-build-debug/opencvTest /home/vitaly/Pictures/img.jpg OpenCV Error: Null pointer (NULL guiReceiver (please create a window)) in cvAddText, file /home/vitaly/Documents/opencv/opencv/modules/highgui/src/window_QT.cpp, line 114 terminate called after throwing an instance of 'cv::Exception' what(): /home/vitaly/Documents/opencv/opencv/modules/highgui/src/window_QT.cpp:114: error: (-27) NULL guiReceiver (please create a window) in function cvAddText

    which goes away if I add

    namedWindow("test", WINDOW_AUTOSIZE);
    

    before addText.

    However, I cannot understand why would qt or opencv need an opened window for that ? I don't need to display the image, I'm only using it to put text on image and then save it, I don't want to create any windows.

    So here's my questions

    1. Why window is required for that ?
    2. Is there a way around it ? (To not create windows)

    As you can see in the source code:

    CV_IMPL void cvAddText(const CvArr* img, const char* text, CvPoint org, CvFont* font)
    {
        if (!guiMainThread)
            CV_Error( CV_StsNullPtr, "NULL guiReceiver (please create a window)" );
    
        QMetaObject::invokeMethod(guiMainThread,
            "putText",
            autoBlockingConnection(),
            Q_ARG(void*, (void*) img),
            Q_ARG(QString,QString::fromUtf8(text)),
            Q_ARG(QPoint, QPoint(org.x,org.y)),
            Q_ARG(void*,(void*) font));
    }
    

    addText requires a gui thread. as the actual drawing happens in that thread. No thread, no function, no drawing...

    Why is it like that? Well because it made sense to somebody I guess.

    It's open source, feel free to code your own workaround. Otherwise use OpenCV's putText.

    展开全文
  • 最近在做工程的时候遇到一个问题:同一张图在cpu上做前处理和在gpu上做前处理,结果不一致。最终导致模型的输出结果也不一致。仔细对了一下代码,问题出在resize这个函数上了...去调试了下opencv的源代码,发现对于...

    最近在做工程的时候遇到一个问题:

    同一张图在cpu上做前处理和在gpu上做前处理,结果不一致。

    最终导致模型的输出结果也不一致。

    仔细对了一下代码,问题出在resize这个函数上了。

    cpu上用的是cv::resize,默认是用的双线性差值。

    gpu上用的是cv::cuda::resize,默认也是用的双线性差值。

    不过这两个输出结果不同,也就是说两者的实现方式不一样。

    去调试了下opencv的源代码,发现对于cpu版本的resize,如果opencv编译时开启了IPP指令集,opencv会去使用ipp版本的resize,代码大约在opencv-x.x.x/modules/imgproc/src/resize.cpp 的3722行,现在问题来了。

    ipp版本的resize并不是完全按照双线性差值的算法来做的。

    而且调试起来很费劲。

    关闭了IPP的编译选项后,opencv的resize就和实际的双线性差值算法一致了。

    opencv内部resize逻辑很复杂,只是一个resize.cpp 都有3k多行,我想做的是尽量简化逻辑,这样可以更好的在cuda上写代码。

    双线性差值的算法网上有很多解释,一般流程是先计算系数和像素值的坐标,然后去计算相应位置的像素值。

    在cuda上造轮子的话,就要考虑几个场景,第一个是大图往小图resize以及小图往大图做resize。

    目前代码已经写完,精度也和opencv的resize对上了。稍后会更新到github上。


    代码已经提到github了 inisis/Capella

    展开全文
  • OpenCV2.3.1 putText乱码

    千次阅读 2017-12-28 09:37:50
    最近一个项目中用OpenCV2.3.1在图片中叠加文字,即使用putText接口,工程使用如下配置时,叠加到图片中的文字出现乱码 改为如下设置可解决问题,导致该问题的原因可能是OpenCV2.3.1对多字节字符集不兼容(未验证...
  • 先转成PIL的图片格式,再用PIL绘制字体,然后再转回opencv图片格式 定义方法 from PIL import Image, ImageDraw, ImageFont def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20): ...
  • Python OpenCV窗口名乱码

    千次阅读 2020-03-19 15:59:34
    问题描述 Python OpenCV窗口名乱码 import cv2 img = cv2.imread('1.jpg') cv2.imshow('原图', img) cv2.waitKey(0) cv2.destroyAllWindows() 解决方案 先编码为GBK,再解码为UTF-8 import cv2 def winname(name): ...
  • ”的乱码,需要特殊处理一下。 下文提供封装好的(代码)方法,供OpenCV添加中文使用。 效果预览 实现思路 使用PIL的图片绘制添加中文,可以指定字体文件,那么也就是说使用PIL可以实现中文的输出。 有思路之后,接...
  • 解决opencv putText()乱码问题

    千次阅读 2020-05-12 11:02:08
    使用cv2.putText()只能显示英文字符,中文会出现乱码问题, 因此使用PIL在图片上绘制添加中文,可以指定字体文件。 大体思路: OpenCV图片格式转换成PIL的图片格式; 使用PIL绘制文字; PIL图片格式转换成...
  • CUDA 模块在 opencv_contrib 包中,需下载与 opencv 版本一致的 opencv_contrib。在 cmake 的时候要加如下选项:-D WITH_CUDA=ON -D BUILD_CUDA_STUBS=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-...
  • 所以卸载了再装完整版opencv3.3或者别的卸载sudo apt purge libopencv*安装github上的nano_build_opencv 脚本运行,选择版本即可查看板本opencv_versionros用catkin_make编译的时候,找不到OpenC...
  • 下面就用一个图来直观的表示一下: 可以看到减去均值后的图b,天空的纹理被消除了,凸显出了图片中的车和高楼等主要特征 3、计算均值与方差 # 首先,你需要安装numpy和opencv模块。# opencv 可以通过下面的命令来...
  • 先说PC环境:ubuntu 18.04 LTS2080Ti x 4 + i9 10990OpenCV 4.2.0 (从源码自行编译)anaconda3 (可用可不用)caffe (github上最新版本)caffe编译方式一:不使用anaconda3首先,关闭.bashrc中所有与an...
  • OpenCV要使用GPU加速需要重新编译OpenCV。本人编译环境:win10 X64 vs2013 编译opencv-3.4.2 + contrib-3.4.2 + cuda10.0一、环境和资源准备1、计算机必须有支持CUDA 的NVIDIA GPU,并且装好了驱动程序。安装CUDA ...
  • OpenCV在图片中输出中文乱码解决方案
  • 话不多说,直接上代码 # -*- coding: utf-8 -*- import cv2 ############## 步骤1 ################ import sys if sys.getdefaultencoding()!... reload(sys)#重载sys模块 sys.setdefaultencoding('ut...
  • 在上次用 CUDA实现导向滤波 后,想着导向滤波能以很小的mask还原高分辨率下的边缘,能不能搞点事情出来,当时正好在研究Darknet框架,然后又看到grabcut算法,用opencv试了下,感觉效果有点意思,后面想了下,这几个...
  • install opencv首先安装这些个依赖库sudo apt-get install -y autoconf automake build-essential git libass-dev libfreetype6-dev libsdl2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev ...
  • 不少人喜欢在Property manager(VS2010)中配置debug和release,这样子新建工程就不用繁琐的加入库文件了,但是这种方法添加库文件debug和release是相同的(实际debug和release不同,release下每个库文件最后都有...
  • 使用cv2.putText()只能显示英文字符,中文会出现乱码问题, 因此使用PIL在图片上绘制添加中文,可以指定字体文件。 大体思路: OpenCV图片格式转换成PIL的图片格式; 使用PIL绘制文字; PIL图片格式转换成...
  • 作者:PAI团队进入正题前,还是先打个招聘小广告,欢迎对我们工作感兴趣的同学联系我们,细节参见这里,可以直接邮件muzhuo.yj@alibaba-inc.com。...在这篇文章里,我们会介绍一个AI编译优化技术在...
  • 点击上方蓝字关注我们做计算机视觉的同学肯定离不开opencv和dlib,如何快速...安装opencv首先安装这些个依赖库sudo apt-get install -y autoconf automake build-essential git libass-dev libfreetype6-dev libs...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,485
精华内容 594
关键字:

opencv乱码