国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ OpenCV【解決putText不能顯示中文】

這篇具有很好參考價值的文章主要介紹了C++ OpenCV【解決putText不能顯示中文】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

????????使用cv::putText寫中文字符時輸出結果為"??????"。。。。。。這怎么能忍?

????????python方法中可以將opencv圖片轉化為PIL,寫中文之后再轉回opencv格式。

????????C++方法中通常利用freetype庫來實現(xiàn),freetype打包的win32靜態(tài)庫可以在C#通過dll引用進行調(diào)用,這需要其版本跟CvxText對應,否則會出現(xiàn)錯誤,其在x64平臺也一樣。

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


?【putText.h】

#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 putTextHusky(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】

#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 putTextHusky(Mat &dst, const char* str, Point org, Scalar color, int fontSize, const char* fn, bool italic, bool underline)//后倆參數(shù):斜體,下劃線
{
	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);
}

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

【示例】

#include <opencv2/opencv.hpp>
#include "putText.h"

using namespace std;
using namespace cv;

int main()//自己寫庫解決putText無法顯示中文字符問題
{
	Mat img = imread("lyf.png");

	putText(img, "中文無法顯示...", Point(50, 50), 2, 1, Scalar(0, 0, 255), 1, 8, false);
	putTextHusky(img, "Arial字體...", Point(50, 100), Scalar(0, 0, 255), 30, "Arial");
	putTextHusky(img, "微軟雅黑字體...", Point(50, 150), Scalar(0, 255, 0), 30, "微軟雅黑", true, true);
	putTextHusky(img, "楷體字體...\n", Point(50, 200), Scalar(128, 255, 0), 30, "楷體", true, true);
	//imwrite("lyfWrite.png", img);
	imshow("test", img);
	waitKey(0);
	
	system("pause");
	return 0;
}

c++ opencv puttext 中文,OpenCV學習,opencv,c++,計算機視覺文章來源地址http://www.zghlxwxcb.cn/news/detail-538321.html

到了這里,關于C++ OpenCV【解決putText不能顯示中文】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【C++的OpenCV】第十五課-OpenCV的繪圖工具(rectangle、circle、line、polylines、putText)常用方法簡介

    【C++的OpenCV】第十五課-OpenCV的繪圖工具(rectangle、circle、line、polylines、putText)常用方法簡介

    ?????? 歡迎各位來到小白 p i a o 的學習空間! color{red}{歡迎各位來到小白piao的學習空間!} 歡迎各位來到小白 p ia o 的學習空間! ?????? ?? C++Python所有的入門技術皆在 我的主頁 color{#0cc123}{我的主頁} 我的主頁 :我的主頁 1.1.1 利用構造函數(shù)Mat中的一些形式完成快速創(chuàng)

    2024年02月06日
    瀏覽(22)
  • Opencv C++ 繪制中文

    Opencv C++ 繪制中文

    GitHub - ITC-AI/Opencv_Chinese: C++ 的 Opencv繪制中文 參考 https://blog.csdn.net/long630576366/article/details/131440684 X64的編譯鏈 Arm的編譯鏈 (1) 安裝opencv 在 Ubuntu 上安裝 OpenCV,你可以使用以下命令: 在 CentOS 上安裝 OpenCV,你可以使用以下命令: (2) 安裝FreeType 在 Ubuntu 上安裝 FreeType,可以使用

    2024年04月17日
    瀏覽(13)
  • opencv顯示圖像中文標題亂碼解決

    opencv顯示圖像中文標題亂碼解決

    最終解決效果: 解決方法:通過指定編碼返回字符串 完整示例代碼: c++默認支持中文,直接調(diào)用imshow可顯示 C++示例代碼: 命令行執(zhí)行python代碼:

    2024年02月11日
    瀏覽(30)
  • 【C++的OpenCV】第三課-OpenCV圖像加載和顯示

    本章節(jié)中,將會學習到: 加載圖像(cv::imread()函數(shù)) 創(chuàng)建一個圖像顯示的窗口(cv::namedWindow()函數(shù)) 在窗口中顯示圖片(cv::imshow()函數(shù)) 功能介紹: ? ? ? ? 從指定路徑中讀取所選擇的圖像 參數(shù)解釋: Mat image: ? ? image 是一個Mat的對象。 ? ? Mat 是一種OpenCV中的圖像存儲

    2024年02月05日
    瀏覽(29)
  • C++ 使用opencv加載并顯示RGB圖像和深度圖像

    C++ 使用opencv加載并顯示RGB圖像和深度圖像

    rgb圖像是一般的彩色圖像格式,深度圖像是存儲在xml文件中,c++讀取代碼如下: 當然,需要安裝并配置opencv,配置opencv細節(jié)可參考其他博客 效果如下: 若opencv加載深度數(shù)據(jù)集失敗,就請參考這篇博客,這是作者在加載深度數(shù)據(jù)時失敗所寫解決方法:https://mp.csdn.net/mp_blog/cr

    2024年02月12日
    瀏覽(24)
  • OpenCV4(C++)—— 視頻和攝像頭的加載、顯示與保存

    ??視頻或攝像頭的加載是使用 cv::VideoCapture 類。(這個類和 ifstream 類比較相似,視頻或攝像頭的加載和文本文件操作是大致相同。主要步驟:(1)加載(打開)視頻或視像頭。(2) 判斷加載是否成功。 (3)讀取內(nèi)容。(4)關閉。) 注意: ??(1)VideoCapture類變量同時

    2024年02月06日
    瀏覽(22)
  • Baumer工業(yè)相機堡盟工業(yè)相機如何使用OpenCV實現(xiàn)相機圖像的顯示(C++)

    Baumer工業(yè)相機堡盟工業(yè)相機如何使用OpenCV實現(xiàn)相機圖像的顯示(C++)

    ? Baumer工業(yè)相機堡盟相機是一種高性能、高質(zhì)量的工業(yè)相機,可用于各種應用場景,如物體檢測、計數(shù)和識別、運動分析和圖像處理。 Baumer的萬兆網(wǎng)相機擁有出色的圖像處理性能,可以實時傳輸高分辨率圖像。此外,該相機還具有快速數(shù)據(jù)傳輸、低功耗、易于集成以及高度

    2024年01月20日
    瀏覽(24)
  • DEV C++光標不在有漢字一行時漢字不顯示以及中文亂碼問題解決方法

    DEV C++光標不在有漢字一行時漢字不顯示以及中文亂碼問題解決方法

    前言:博主剛開始使用DEV C++時真的是被這兩個問題搞得焦頭爛額(orz),以至于有中文時都用拼音代替,但是這樣程序運行出來后實在是太影響閱讀了。于是我上網(wǎng)搜集資料,但網(wǎng)上的資料真的是讓人眼花繚亂,于是在此我把這兩個問題羅列出來,用圖文方式簡單粗暴的讓讀

    2023年04月08日
    瀏覽(28)
  • 【opencv3】鼠標框選矩形并顯示當前像素點坐標和矩形中心點坐標C++

    【opencv3】鼠標框選矩形并顯示當前像素點坐標和矩形中心點坐標C++

    (1)用鼠標在圖中框選矩形目標,然后保存框選的圖片; (2)鼠標拖動過程中要求顯示框的線條以及鼠標當前像素點信息(坐標和RGB值); (3)拖動完成后單獨顯示框取的圖像,拖動完成后cout輸出框中心像素點坐標。 鼠標事件: 鼠標左鍵按下時(event == CV_EVENT_LBUTTONUP),標

    2024年02月09日
    瀏覽(86)
  • Baumer工業(yè)相機堡盟工業(yè)相機如何使用BGAPISDK和OpenCV設置圖像進行比例顯示(C++)

    Baumer工業(yè)相機堡盟相機是一種高性能、高質(zhì)量的工業(yè)相機,可用于各種應用場景,如物體檢測、計數(shù)和識別、運動分析和圖像處理。 Baumer的萬兆網(wǎng)相機擁有出色的圖像處理性能,可以實時傳輸高分辨率圖像。此外,該相機還具有快速數(shù)據(jù)傳輸、低功耗、易于集成以及高度可擴

    2024年02月10日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包