wangrong
2025-01-03 2c4b8838f89bebca97615c5f0bac2c58e0349771
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
#include "vp_text_osd_node.h"
 
namespace vp_nodes {
        
    vp_text_osd_node::vp_text_osd_node(std::string node_name, std::string font): vp_node(node_name) {
        ft2 = cv::freetype::createFreeType2();
        ft2->loadFontData(font, 0);
        this->initialized();
    }
    
    vp_text_osd_node::~vp_text_osd_node() {
        deinitialized();
    }
 
    std::shared_ptr<vp_objects::vp_meta> vp_text_osd_node::handle_frame_meta(std::shared_ptr<vp_objects::vp_frame_meta> meta) {
        // operations on osd_frame
        if (meta->osd_frame.empty()) {
            // double times higher than frame 
            meta->osd_frame = cv::Mat(meta->frame.rows * 2, meta->frame.cols, meta->frame.type());
        }
 
        auto canvas1 = meta->frame.clone();
        auto canvas2 = cv::Mat(meta->frame.rows, meta->frame.cols, meta->frame.type(), cv::Scalar(255, 255, 255));
 
        for (int i = 0; i < meta->text_targets.size(); i++) {
            auto& text = meta->text_targets[i];
 
            cv::Point rook_points[4];
            for (int m = 0; m < text->region_vertexes.size(); m++) {
                rook_points[m] =
                    cv::Point(text->region_vertexes[m].first, text->region_vertexes[m].second);
            }
 
            const cv::Point *ppt[1] = {rook_points};
            int npt[] = {4};
 
            cv::polylines(canvas1, ppt, npt, 1, 1, CV_RGB(0, 255, 0), 2, cv::LINE_AA, 0);
            cv::polylines(canvas2, ppt, npt, 1, 1, CV_RGB(0, 255, 0), 1, cv::LINE_AA, 0);
            
            ft2->putText(canvas2, text->text, rook_points[3], 20, cv::Scalar(255, 0, 0), cv::FILLED, cv::LINE_AA, true);
        }
 
        // copy back to osd frame
        auto roi1 = meta->osd_frame(cv::Rect(0, 0, meta->frame.cols, meta->frame.rows));
        auto roi2 = meta->osd_frame(cv::Rect(0, meta->frame.rows, meta->frame.cols, meta->frame.rows));
 
        canvas1.copyTo(roi1);
        canvas2.copyTo(roi2);
        
        return meta;
    }
}