日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV显示中文汉字,未使用CvxText和FreeType库

發布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV显示中文汉字,未使用CvxText和FreeType库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV顯示中文漢字,未使用CvxText和FreeType庫

采用windows的GDI顯示系統的TrueType字體,沒有封裝,就兩個函數,分成了h和cpp文件,可以自己編輯文件名和函數名,亦可以直接將cpp的代碼復制到你需要的程序中。

  • putText.h
  • putText.cpp
  • 演示

文件putText.h

后面的cpp文件有一些簡要說明。

#ifndef PUTTEXT_H_

#define PUTTEXT_H_

?

#include <windows.h>

#include <string>

#include <opencv2/opencv.hpp>

?

using namespace cv;

?

void GetStringSize(HDC hDC, const char* str, int* w, int* h);

void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize,

??? const char *fn = "Arial", bool italic = false, bool underline = false);

?

#endif // PUTTEXT_H_

?

putText.cpp

第二個函數putTextZH(),默認使用Arial字體,也可以設置成操作系統中已經安裝的字體,如“宋體”、“微軟雅黑”、“Times New Roman”等;默認顯示非斜體、非下劃線。

#include "putText.h"

?

void GetStringSize(HDC hDC, const char* str, int* w, int* h)

{

??? SIZE size;

??? GetTextExtentPoint32A(hDC, str, strlen(str), &size);

??? if (w != 0) *w = size.cx;

??? if (h != 0) *h = size.cy;

}

?

void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize, const char* fn, bool italic, bool underline)

{

??? CV_Assert(dst.data != 0 && (dst.channels() == 1 || dst.channels() == 3));

?

??? int x, y, r, b;

??? if (org.x > dst.cols || org.y > dst.rows) return;

??? x = org.x < 0 ? -org.x : 0;

??? y = org.y < 0 ? -org.y : 0;

?

??? LOGFONTA lf;

??? lf.lfHeight = -fontSize;

??? lf.lfWidth = 0;

??? lf.lfEscapement = 0;

??? lf.lfOrientation = 0;

??? lf.lfWeight = 5;

??? lf.lfItalic = italic;?? //斜體

??? lf.lfUnderline = underline; //下劃線

??? lf.lfStrikeOut = 0;

??? lf.lfCharSet = DEFAULT_CHARSET;

??? lf.lfOutPrecision = 0;

??? lf.lfClipPrecision = 0;

??? lf.lfQuality = PROOF_QUALITY;

??? lf.lfPitchAndFamily = 0;

??? strcpy_s(lf.lfFaceName, fn);

?

??? HFONT hf = CreateFontIndirectA(&lf);

??? HDC hDC = CreateCompatibleDC(0);

??? HFONT hOldFont = (HFONT)SelectObject(hDC, hf);

?

??? int strBaseW = 0, strBaseH = 0;

??? int singleRow = 0;

??? char buf[1 << 12];

??? strcpy_s(buf, str);

??? char *bufT[1 << 12];? // 這個用于分隔字符串后剩余的字符,可能會超出。

??????????????????????? ? //處理多行

??? {

??????? int nnh = 0;

??????? int cw, ch;

?

??????? const char* ln = strtok_s(buf, "\n", bufT);

??????? while (ln != 0)

??????? {

??????????? GetStringSize(hDC, ln, &cw, &ch);

??????????? strBaseW = max(strBaseW, cw);

??????????? strBaseH = max(strBaseH, ch);

?

??????????? ln = strtok_s(0, "\n", bufT);

??????????? nnh++;

??????? }

??????? singleRow = strBaseH;

??????? strBaseH *= nnh;

??? }

?

??? if (org.x + strBaseW < 0 || org.y + strBaseH < 0)

??? {

??????? SelectObject(hDC, hOldFont);

??????? DeleteObject(hf);

??????? DeleteObject(hDC);

??????? return;

??? }

?

??? r = org.x + strBaseW > dst.cols ? dst.cols - org.x - 1 : strBaseW - 1;

??? b = org.y + strBaseH > dst.rows ? dst.rows - org.y - 1 : strBaseH - 1;

??? org.x = org.x < 0 ? 0 : org.x;

??? org.y = org.y < 0 ? 0 : org.y;

?

??? BITMAPINFO bmp = { 0 };

??? BITMAPINFOHEADER& bih = bmp.bmiHeader;

??? int strDrawLineStep = strBaseW * 3 % 4 == 0 ? strBaseW * 3 : (strBaseW * 3 + 4 - ((strBaseW * 3) % 4));

?

??? bih.biSize = sizeof(BITMAPINFOHEADER);

??? bih.biWidth = strBaseW;

??? bih.biHeight = strBaseH;

??? bih.biPlanes = 1;

??? bih.biBitCount = 24;

??? bih.biCompression = BI_RGB;

??? bih.biSizeImage = strBaseH * strDrawLineStep;

??? bih.biClrUsed = 0;

??? bih.biClrImportant = 0;

?

??? void* pDibData = 0;

??? HBITMAP hBmp = CreateDIBSection(hDC, &bmp, DIB_RGB_COLORS, &pDibData, 0, 0);

?

??? CV_Assert(pDibData != 0);

??? HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp);

?

??? //color.val[2], color.val[1], color.val[0]

??? SetTextColor(hDC, RGB(255, 255, 255));

??? SetBkColor(hDC, 0);

??? //SetStretchBltMode(hDC, COLORONCOLOR);

?

??? strcpy_s(buf, str);

??? const char* ln = strtok_s(buf, "\n", bufT);

??? int outTextY = 0;

??? while (ln != 0)

??? {

??????? TextOutA(hDC, 0, outTextY, ln, strlen(ln));

??????? outTextY += singleRow;

??????? ln = strtok_s(0, "\n", bufT);

??? }

??? uchar* dstData = (uchar*)dst.data;

??? int dstStep = dst.step / sizeof(dstData[0]);

??? unsigned char* pImg = (unsigned char*)dst.data + org.x * dst.channels() + org.y * dstStep;

??? unsigned char* pStr = (unsigned char*)pDibData + x * 3;

??? for (int tty = y; tty <= b; ++tty)

??? {

??????? unsigned char* subImg = pImg + (tty - y) * dstStep;

??????? unsigned char* subStr = pStr + (strBaseH - tty - 1) * strDrawLineStep;

??????? for (int ttx = x; ttx <= r; ++ttx)

??????? {

??????????? for (int n = 0; n < dst.channels(); ++n) {

??????????????? double vtxt = subStr[n] / 255.0;

??????????????? int cvv = vtxt * color.val[n] + (1 - vtxt) * subImg[n];

??????????????? subImg[n] = cvv > 255 ? 255 : (cvv < 0 ? 0 : cvv);

??????????? }

?

??????????? subStr += 3;

??????????? subImg += dst.channels();

??????? }

??? }

?

??? SelectObject(hDC, hOldBmp);

??? SelectObject(hDC, hOldFont);

??? DeleteObject(hf);

??? DeleteObject(hBmp);

??? DeleteDC(hDC);

}

?

?

演示

讀取一個圖片加入字體,顯示。

#include "opencv2/opencv.hpp"

?

#include "putText.h"

?

using namespace std;

using namespace cv;

?

int main()

{

??? Mat img = imread("1000.jpg");

?

??? putTextZH(img, "Arial字體換...\n行顯示!", Point(50, 50), Scalar(0, 0, 255), 30, "Arial");

??? putTextZH(img, "微軟雅黑字體換...\n行,斜體,下劃線,顯示!", Point(50, 100), Scalar(0, 255, 0), 30, "微軟雅黑", true, true);

??? putTextZH(img, "楷體字體換...\n行,斜體,下劃線,顯示!", Point(50, 200), Scalar(128, 255, 0), 30, "楷體", true, true);

??? putTextZH(img, "梁朝偉", Point(500, 500), Scalar(0, 0, 255), 30, "楷體", false, false);

?

??? imshow("test", img);

?

??? waitKey();

?

??? return 0;

}

?

?

總結

以上是生活随笔為你收集整理的OpenCV显示中文汉字,未使用CvxText和FreeType库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品一区二区三区蜜臀 | a猛片免费播放 | 最近中文字幕一区二区 | 免费观看已满十八岁 | 久操视频在线免费观看 | 欧美高清不卡 | 亚洲欧美精品一区二区 | 国产精品女优 | 亚洲精品99 | 尹人久久 | 一区二区三区不卡在线观看 | 国产三级av在线播放 | 久久久99国产精品免费 | 亚洲精品久久久中文字幕 | 国外成人在线视频 | 日韩av地址 | 国产亚洲欧美日韩高清 | 美女视频黄a视频全免费观看 | 另类一区二区 | 精品人妻一区二区三区三区四区 | 欧美亚洲综合视频 | 日本美女黄色一级片 | 妓院一钑片免看黄大片 | 黑人巨大精品欧美一区二区 | 93久久精品日日躁夜夜躁欧美 | 免费一级全黄少妇性色生活片 | 香蕉视频免费 | 夜夜躁狠狠躁日日躁av | a√在线观看 | 午夜影视免费 | 国产叼嘿视频在线观看 | 精品人妻一区二区乱码 | 国产一区二区三区在线播放无 | 欧洲免费毛片 | 殴美一级视频 | 天天碰天天操 | 黄色网页在线免费观看 | 欧美性大交 | av在线片| 成人免费看片入口 | 奶水喷溅 在线播放 | 日韩人妻一区二区三区蜜桃 | 日韩精品影院 | 99在线精品视频免费观看20 | 久久精品系列 | 精品人妻少妇嫩草av无码专区 | 免费一级全黄少妇性色生活片 | 国产成人欧美一区二区三区的 | 黄色成年网站 | 亚洲午夜精品一区 | 亚洲精品在线视频观看 | 五月天综合久久 | 亚欧在线视频 | 欧美混交群体交 | 日韩动漫av | 物业福利视频 | 欧美极品aaaaabbbbb | 男人天堂中文字幕 | 亚洲 激情 小说 另类 欧美 | 在线看v片 | 欧美www视频 | 双性人妖互交localhost | 亚洲AV无码国产精品播放在线 | 一本高清dvd在线播放 | 欧美老熟妇又粗又大 | 91看篇 | 一区二区三区av | 九九99视频 | 午夜亚洲国产 | 亚洲一区二区日韩欧美 | 欧美黑人三级 | 2019中文字幕在线观看 | 国产黄 | 欧美无砖砖区免费 | 久久久久久爱 | 久久久九九九九 | 成人勉费视频 | 欧美国产日韩一区 | 天天天天天干 | 黄色污污网站在线观看 | 国产精品福利电影 | 有码中文 | 精品91自产拍在线观看二区 | 欧美女优视频 | 国产丰满农村老妇女乱 | 亚洲涩色| 狠狠做深爱婷婷综合一区 | 91成人精品国产刺激国语对白 | 青在线视频 | 少妇情理伦片丰满午夜在线观看 | 精品无码在线观看 | 日韩骚片 | 日韩视频在线免费 | 亚洲午夜福利一区二区三区 | 中国国产黄色片 | av不卡一区二区三区 | 韩国主播青草55部完整 | 欧美成人一区二区视频 | 色综合五月天 |