フォーマットされたテキストを画像に書き込みたい。OpenCV が提供するデフォルト フォントのセットは限られています。他の利用は可能ですか?たとえば、*.ttf ファイル (Ubuntu) からそれらを読み取るには?
質問する
20747 次
2 に答える
13
Qt バインディングを使用できない、または使用したくない場合は、CAIRO で行う方法を次に示します。
#include <opencv2/opencv.hpp>
#include <cairo/cairo.h>
#include <string>
void putTextCairo(
cv::Mat &targetImage,
std::string const& text,
cv::Point2d centerPoint,
std::string const& fontFace,
double fontSize,
cv::Scalar textColor,
bool fontItalic,
bool fontBold)
{
// Create Cairo
cairo_surface_t* surface =
cairo_image_surface_create(
CAIRO_FORMAT_ARGB32,
targetImage.cols,
targetImage.rows);
cairo_t* cairo = cairo_create(surface);
// Wrap Cairo with a Mat
cv::Mat cairoTarget(
cairo_image_surface_get_height(surface),
cairo_image_surface_get_width(surface),
CV_8UC4,
cairo_image_surface_get_data(surface),
cairo_image_surface_get_stride(surface));
// Put image onto Cairo
cv::cvtColor(targetImage, cairoTarget, cv::COLOR_BGR2BGRA);
// Set font and write text
cairo_select_font_face(
cairo,
fontFace.c_str(),
fontItalic ? CAIRO_FONT_SLANT_ITALIC : CAIRO_FONT_SLANT_NORMAL,
fontBold ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size(cairo, fontSize);
cairo_set_source_rgb(cairo, textColor[2], textColor[1], textColor[0]);
cairo_text_extents_t extents;
cairo_text_extents(cairo, text.c_str(), &extents);
cairo_move_to(
cairo,
centerPoint.x - extents.width/2 - extents.x_bearing,
centerPoint.y - extents.height/2- extents.y_bearing);
cairo_show_text(cairo, text.c_str());
// Copy the data to the output image
cv::cvtColor(cairoTarget, targetImage, cv::COLOR_BGRA2BGR);
cairo_destroy(cairo);
cairo_surface_destroy(surface);
}
呼び出しの例:
putTextCairo(mat, "Hello World", cv::Point2d(50,50), "arial", 15, cv::Scalar(0,0,255), false, false);
ターゲット画像は BGR を想定しています。
テキストの中心を指定されたポイントに置きます。異なる配置が必要な場合は、cairo_move_to
呼び出しを変更する必要があります。
于 2014-10-10T20:54:07.970 に答える
3
他のフォントを使用することは可能ですが、Qt ライブラリを OpenCV にリンクし、cvFontQt で cvAddText 関数を使用する必要があります。
http://docs.opencv.org/modules/highgui/doc/qt_new_functions.html#addtext
http://docs.opencv.org/modules/highgui/doc/qt_new_functions.html#fontqt
OpenCV と多かれ少なかれ同じパフォーマンスで試すことができる他のソリューションがあります。たとえば、CAIRO を使用してフォントを画像に書き込むことができます。
于 2013-01-16T15:54:06.830 に答える