在图像 OpenCV 上写非常小的字符?

Cro*_*Hop 2 c++ opencv image-processing

因此,我尝试在图像顶部使用 putText() 编写单个字符以适合 25x25 框,但文本太小而无法呈现,它看起来就像我选择文本的任何颜色的斑点。有没有办法用 OpenCV 创建小的、可读的文本以覆盖在图像上?

Mar*_*ell 5

这是一个使用两者的示例putText(),还从在 Photoshop 或 GIMP 中创建的文件中加载字符。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>

using namespace cv;
using namespace std;

int
main(int argc,char*argv[])
{
   // Make a 3 channel image
   cv::Mat main(200,300,CV_8UC3);

   // Fill entire image with magenta
   main = cv::Scalar(255,0,255);

   // Load a character "M" from a file and overlay
   Mat txt = cv::imread("M.png",-CV_LOAD_IMAGE_ANYDEPTH);
   txt.copyTo(main(cv::Rect(80,120,txt.cols,txt.rows)));

   // Now use puttext() to do a white S
   int fontFace = FONT_HERSHEY_COMPLEX_SMALL;
   double fontScale=1.5;
   string text="S";
   putText(main,"S",Point(60,100),fontFace,fontScale,Scalar(255,255,255));

   // Save to disk
   imwrite("result.png",main);
}
Run Code Online (Sandbox Code Playgroud)

这是M.png文件:

在此处输入图片说明

结果如下:

在此处输入图片说明


我还注意到抗锯齿字体(在下图中的右侧)看起来更容易阅读:

在此处输入图片说明

#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>

using namespace cv;
using namespace std;

int
main(int argc,char*argv[])
{
   // Make a 3 channel image
   cv::Mat main(280,800,CV_8UC3);

   // Fill entire image with magenta
   main = cv::Scalar(255,0,255);

   double fontScale=1.5;
   int thickness=1;
   int x=10,y=40;
   putText(main,"Simplex",Point(x,y),CV_FONT_HERSHEY_SIMPLEX,fontScale,Scalar(255,255,255),thickness,8);
   putText(main,"Simplex AA",Point(x+400,y),CV_FONT_HERSHEY_SIMPLEX,fontScale,Scalar(255,255,255),thickness,CV_AA);
   y+=40;
   putText(main,"Plain",Point(x,y),CV_FONT_HERSHEY_PLAIN,fontScale,Scalar(255,255,255),thickness,8);
   putText(main,"Plain AA",Point(x+400,y),CV_FONT_HERSHEY_PLAIN,fontScale,Scalar(255,255,255),thickness,CV_AA);
   y+=40;
   putText(main,"Duplex",Point(x,y),CV_FONT_HERSHEY_DUPLEX,fontScale,Scalar(255,255,255),thickness,8);
   putText(main,"Duplex AA",Point(x+400,y),CV_FONT_HERSHEY_DUPLEX,fontScale,Scalar(255,255,255),thickness,CV_AA);
   y+=40;
   putText(main,"Complex",Point(x,y),CV_FONT_HERSHEY_COMPLEX,fontScale,Scalar(255,255,255),thickness,8);
   putText(main,"Complex AA",Point(x+400,y),CV_FONT_HERSHEY_COMPLEX,fontScale,Scalar(255,255,255),thickness,CV_AA);
   y+=40;
   putText(main,"Triplex",Point(x,y),CV_FONT_HERSHEY_TRIPLEX,fontScale,Scalar(255,255,255),thickness,8);
   putText(main,"Triplex AA",Point(x+400,y),CV_FONT_HERSHEY_TRIPLEX,fontScale,Scalar(255,255,255),thickness,CV_AA);
   y+=40;
   putText(main,"Script",Point(x,y),CV_FONT_HERSHEY_SCRIPT_SIMPLEX,fontScale,Scalar(255,255,255),thickness,8);
   putText(main,"Script AA",Point(x+400,y),CV_FONT_HERSHEY_SCRIPT_SIMPLEX,fontScale,Scalar(255,255,255),thickness,CV_AA);

   // Save to disk
   imwrite("result.png",main);
}
Run Code Online (Sandbox Code Playgroud)