1. 前言
题目是牛客网的, 链接如下:
https://www.nowcoder.com/discuss/19598?type=0&order=0&pos=4&page=1
觉得这个蛮有意思的, 于是顺手用opencv 实现了一下
2. 实现
2.1 效果
2.2 字符添加位置的说明
这里面感觉唯一的一个需要推敲的一个点, 应该就是实现字符的居中放置了, 牛客网上好多同学采用的是人机交互的方式, 手工放置这个数据, 感觉比较费劲。
我们这里通过 getTextSize 获取字符串文本的宽度和高度信息, 通过计算得到其在图像中的相应位置, 从而实现数字的居中放置。
3. 实现代码
#include <opencv.hpp>
#include <string>
#include <iostream>
using namespace cv;
using namespace std;
void drawTopNum(string tip, Scalar color, int len, Mat & picNum, double fontScale = 3, int thinkness = 10){
Size size(len, len);
circle(picNum, Point(picNum.cols - size.width / 2, size.height / 2), len / 2, color, CV_FILLED);
int fontface = CV_FONT_HERSHEY_SIMPLEX;
Size textSize = getTextSize(tip, fontface, fontScale, thinkness, nullptr);
putText(picNum, tip, Point(picNum.cols - size.width / 2 - textSize.width / 2, size.height / 2 + textSize.height / 2),
fontface, fontScale, Scalar(255, 255, 255), thinkness);
}
int main(int argc, char ** argv){
Mat src = imread("flower_Dance.jpg");
if (src.empty()){
cerr << "没有找到用户头像" << endl;
exit(-1);
}
drawTopNum("1", Scalar(0, 0, 255), 100, src, 2, 5);
imshow("res", src);
waitKey();
return 0;
}