Opencv C++写中文(来自Gemini)

基于与Google Gemini交互获取的Opencv在图片上写汉字的实现

复制代码
sudo apt-get install libfreetype6-dev
sudo apt-get install fonts-wqy-zenhei

CMakeLists.txt

复制代码
cmake_minimum_required(VERSION 3.10) # Or a more recent version

project(OpenCVChineseText)

set(CMAKE_CXX_STANDARD 17) # Or your preferred C++ standard
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# --- Find OpenCV ---
find_package(OpenCV REQUIRED)
if(OpenCV_FOUND)
    message(STATUS "Found OpenCV: ${OpenCV_DIR}")
    include_directories(${OpenCV_INCLUDE_DIRS})
else()
    message(FATAL_ERROR "OpenCV not found. Please set OpenCV_DIR or ensure it's in your PATH.")
endif()

# --- Find FreeType ---
find_package(Freetype REQUIRED)
if(Freetype_FOUND)
    message(STATUS "Found FreeType: ${FREETYPE_DIR}")
    include_directories(${FREETYPE_INCLUDE_DIRS})
else()
    message(FATAL_ERROR "FreeType not found. Please ensure it's installed.")
endif()

# --- Add Executable ---
add_executable(opencv_chinese_text main.cpp) # Replace main.cpp with your source file(s)

# --- Link Libraries ---
target_link_libraries(opencv_chinese_text
    ${OpenCV_LIBS}
    ${FREETYPE_LIBRARIES}
)

# --- Optional: Install target ---
install(TARGETS opencv_chinese_text DESTINATION bin)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/fonts DESTINATION share/opencv_chinese_text) # If you have a fonts folder

main.cpp

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
#include <ft2build.h>
#include FT_FREETYPE_H
#include <opencv2/opencv.hpp>
#include <locale>
#include <codecvt>

int main()
{
    cv::Mat image = cv::Mat::zeros(200, 500, CV_8UC3);
    std::string chineseText = "你好,世界";
    int fontSize = 48;
    int x = 50, y = 100;
    cv::Scalar textColor(255, 255, 255); // White color for text

    FT_Library library;
    if (FT_Init_FreeType(&library))
    {
        std::cerr << "Error initializing FreeType library" << std::endl;
        return -1;
    }

    FT_Face face;
    if (FT_New_Face(library, "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc", 0, &face))
    {
        std::cerr << "Error loading font file" << std::endl;
        FT_Done_FreeType(library);
        return -1;
    }

    FT_Set_Pixel_Sizes(face, 0, fontSize);

    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    std::wstring wide_text = converter.from_bytes(chineseText);

    for (wchar_t wc : wide_text)
    {
        FT_UInt glyph_index = FT_Get_Char_Index(face, wc);
        if (FT_Load_Glyph(face, glyph_index, FT_LOAD_RENDER))
        {
            std::cerr << "Error loading glyph" << std::endl;
            continue;
        }

        FT_Bitmap &bitmap = face->glyph->bitmap;

        for (int i = 0; i < bitmap.rows; ++i)
        {
            for (int j = 0; j < bitmap.width; ++j)
            {
                unsigned char pixel_value = bitmap.buffer[i * bitmap.pitch + j];
                if (pixel_value > 0)
                {
                    cv::Point draw_point(x + face->glyph->bitmap_left + j, y - face->glyph->bitmap_top + i);
                    if (draw_point.x >= 0 && draw_point.x < image.cols && draw_point.y >= 0 && draw_point.y < image.rows)
                    {
                        image.at<cv::Vec3b>(draw_point)[0] = cv::saturate_cast<uchar>(textColor[0] * (pixel_value / 255.0));
                        image.at<cv::Vec3b>(draw_point)[1] = cv::saturate_cast<uchar>(textColor[1] * (pixel_value / 255.0));
                        image.at<cv::Vec3b>(draw_point)[2] = cv::saturate_cast<uchar>(textColor[2] * (pixel_value / 255.0));
                    }
                }
            }
        }

        x += face->glyph->advance.x >> 6;
    }

    FT_Done_Face(face);
    FT_Done_FreeType(library);

    cv::putText(image, "This is English", cv::Point(50, 50), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(255, 255, 255));
    cv::imshow("Image with Text", image);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}
相关推荐
深度研习笔记6 小时前
OpenCV工业视觉实战11|多线程解耦+视频流稳流+推理加速,彻底解决卡顿阻塞,实现毫秒级工业实时检测
人工智能·opencv·计算机视觉
深度研习笔记19 小时前
OpenCV工业视觉进阶14|SQLite违规数据库存储+历史记录查询+Excel报表导出,完成项目商用数据闭环(验收必备)
数据库·opencv·sqlite
C++ 老炮儿的技术栈1 天前
OpenCV 实现社保卡透视矫正:Hough 直线提取四角并转正证件图像
c语言·c++·人工智能·opencv·算法·计算机视觉·c
深度研习笔记1 天前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
深度研习笔记2 天前
OpenCV工业视觉实战06|ROI区域截取+局部精细化检测,锁定作业区域、屏蔽无效背景,大幅提升YOLO检测准确率
人工智能·opencv·yolo
fai厅的秃头姐!2 天前
OpenCV-基础篇
人工智能·opencv·计算机视觉
丨白色风车丨2 天前
OpenCV 基于 HSV 颜色空间实时颜色分割(摄像头蓝色识别)
人工智能·opencv·计算机视觉·hsv颜色识别·python计算机视觉
深度研习笔记2 天前
OpenCV工业视觉实战10|违规语音播报+弹窗告警+重复告警过滤,打造智能声光预警系统(项目加分必备)
人工智能·opencv·计算机视觉
在世修行2 天前
高斯模糊与图像去噪
opencv·gaussianblur
xgc_java3 天前
在Java里把ONNX/OpenCV/FFmpeg跑稳:28篇bytedeco实战小册完整指南
java·opencv·ffmpeg