Operaciones relacionadas con el dibujo de OpenCV C++

conocimientos relacionados con el dibujo

introducción al estilo de línea lineType
El estilo de línea de opencv se describe mediante valores de enumeración:

//! type of line
enum LineTypes {
    
    
    FILLED  = -1,
    LINE_4  = 4, //!< 4-connected line
    LINE_8  = 8, //!< 8-connected line
    LINE_AA = 16 //!< antialiased line
};

LLENADO = -1 Estilo sin línea, para dibujar imágenes cerradas, establezca el parámetro de grosor en -1, que es relleno de color.
LINE_4 = 4 líneas procesadas por el algoritmo de Bresenham basado en conexiones de 4 vecindarios.
Efecto:
inserte la descripción de la imagen aquí
LINE_8 = 8 líneas procesadas por el algoritmo de Bresenham basado en conexiones de 4 vecindarios.
Efecto:
inserte la descripción de la imagen aquí
LINE_AA = 16 Suavizado de filtro gaussiano basado en la línea recta.
Efecto:
inserte la descripción de la imagen aquí

trazar la función de correlación

dibujar circulo
Prototipo de función:

void circle(InputOutputArray img, Point center, int radius,
                       const Scalar& color, int thickness = 1,
                       int lineType = LINE_8, int shift = 0);

imges la imagen de entrada; centeres el centro del círculo dibujado; radiuses el radio del círculo dibujado; colores el color dibujado; thicknesses el ancho de la línea dibujada; lineTypees el estilo de la línea dibujada; shiftdesplazamiento.

dibujar una elipse
Función prototipo 1:

void ellipse(InputOutputArray img, Point center, Size axes,
                        double angle, double startAngle, double endAngle,
                        const Scalar& color, int thickness = 1,
                        int lineType = LINE_8, int shift = 0);

imges la imagen de entrada; colores el color que se dibujará; thicknesses el ancho de línea que se dibujará; lineTypees el estilo de línea shiftque se dibujará;
inserte la descripción de la imagen aquí

Función prototipo 2:

void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color,
                        int thickness = 1, int lineType = LINE_8);

imges la imagen de entrada; colores el color que se dibujará; thicknesses el ancho de línea que se dibujará; lineTypees el estilo de línea shiftque se dibujará;
inserte la descripción de la imagen aquí
dibujar linea recta
Prototipo de función:

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
                     int thickness = 1, int lineType = LINE_8, int shift = 0);

imges la imagen de entrada; pt1es un punto final de la línea; pt2es el otro punto final de la línea; colores el color dibujado; thicknesses el ancho de la línea dibujada; lineTypees el estilo de la línea dibujada; shiftel desplazamiento.
inserte la descripción de la imagen aquí
Dibujar múltiples polilíneas
Función prototipo 1:

void polylines(InputOutputArray img, InputArrayOfArrays pts,
                            bool isClosed, const Scalar& color,
                            int thickness = 1, int lineType = LINE_8, int shift = 0 );

Función prototipo 2:

void polylines(InputOutputArray img, const Point* const* pts, const int* npts,
                          int ncontours, bool isClosed, const Scalar& color,
                          int thickness = 1, int lineType = LINE_8, int shift = 0 );

Estas dos funciones solo son diferentes en el estilo de función, y aquí solo se considera la función 1.
imges la imagen de entrada; ptses el conjunto de puntos de entrada; isClosedla bandera indica si el conjunto de puntos está cerrado; colores el color para dibujar; thicknesses el ancho de línea para dibujar; lineTypees el estilo de línea para dibujar; shiftdesplazamiento.
inserte la descripción de la imagen aquí
dibujar rectángulo
Función prototipo 1:

void rectangle(InputOutputArray img, Point pt1, Point pt2,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);

Función prototipo 2:

void rectangle(InputOutputArray img, Rect rec,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);

Estas dos funciones solo son diferentes en la forma de describir el rectángulo, aquí solo se considera la función 1.
imges la imagen de entrada; pt1es el punto superior izquierdo del rectángulo; pt2es el punto inferior derecho del rectángulo; colores el color que se dibujará; thicknesses el ancho de línea que se dibujará; lineTypees el estilo de línea que se dibujará; shiftdesplazamiento.
inserte la descripción de la imagen aquí
Dibujar un polígono simple relleno
Función prototipo 1:

void fillConvexPoly(InputOutputArray img, InputArray points,
                                 const Scalar& color, int lineType = LINE_8,
                                 int shift = 0);

Función prototipo 2:

void fillConvexPoly(InputOutputArray img, const Point* pts, int npts,
                               const Scalar& color, int lineType = LINE_8,
                               int shift = 0);

Estas dos funciones solo son diferentes en el estilo de función, y aquí solo se considera la función 1.
imges la imagen de entrada; pointses el conjunto de puntos de entrada; colores el color para dibujar; thicknesses el ancho de línea para dibujar; lineTypees el estilo de línea para dibujar; shiftdesplazamiento.
inserte la descripción de la imagen aquí
dibujar texto
Prototipo de función:

void putText( InputOutputArray img, const String& text, Point org,
                         int fontFace, double fontScale, Scalar color,
                         int thickness = 1, int lineType = LINE_8,
                         bool bottomLeftOrigin = false );

imges la imagen de entrada; es textel texto a dibujar; es orgel punto de referencia del texto dibujado; fontFacees el estilo de texto del texto dibujado ; es fontScaleel factor de zoom del texto dibujado ; es el color dibujado; La descripción del estilo de fuente fontFace es un conjunto de valores de enumeración:colorthicknesslineTypebottomLeftOrigin

enum HersheyFonts {
    FONT_HERSHEY_SIMPLEX        = 0, //!< normal size sans-serif font
    FONT_HERSHEY_PLAIN          = 1, //!< small size sans-serif font
    FONT_HERSHEY_DUPLEX         = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
    FONT_HERSHEY_COMPLEX        = 3, //!< normal size serif font
    FONT_HERSHEY_TRIPLEX        = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
    FONT_HERSHEY_COMPLEX_SMALL  = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
    FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
    FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
    FONT_ITALIC                 = 16 //!< flag for italic font
};

Lista de efectos:
inserte la descripción de la imagen aquí
BottomLeftOrigin bandera descripción
Si el valor es verdadero, el punto especificado por org es la esquina superior izquierda del texto insertado.
Si el valor es falso, el punto especificado por org es la esquina inferior izquierda del texto insertado.
inserte la descripción de la imagen aquí

Obtener el tamaño del área de texto getTextSize()
Utilice esta función para ayudar a determinar que el texto dibujado está dentro del área de visualización de la imagen.
Prototipo de función:

Size getTextSize(const String& text, int fontFace,
                            double fontScale, int thickness,
                            CV_OUT int* baseLine);

ejemplo:

#include <iostream>
#include <vector>
#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    
    
	Mat src = Mat::zeros(Size(400, 400), CV_8UC3);

	string text = "hello";
	int fontFace = FONT_HERSHEY_SIMPLEX;
	double fontScale = 1.0;
	int thickness = 2;
	Point org(50, 100);
	int lineType = LINE_8;
	bool bottomLeftOrigin = true;

	putText(src, text, org, fontFace, fontScale, Scalar(0, 255, 0), thickness, lineType, bottomLeftOrigin);

	int baseLine;
	Size size = getTextSize(text, fontFace, fontScale, thickness,&baseLine);

	cout << "baseLine = " << baseLine << endl;
	cout << size << endl;

	imshow("src", src);
	waitKey();

	return 0;
}

输出:
baseLine = 10
[74 x 22]

dibujar segmento de línea de flecha
Prototipo de función:

void arrowedLine(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness=1, int line_type=8, int shift=0, double tipLength=0.1);

imges la imagen de entrada; pt1es el punto inicial del segmento de la línea de flecha; pt2es el punto final del segmento de la línea de flecha; colores el color dibujado; thicknesses el ancho de la línea dibujada; line_typees el estilo de la línea dibujada; shiftes el desplazamiento; tipLengthes la relación de longitud entre la longitud de la flecha y todo el segmento de la línea de la flecha.

dibujar varios marcadores
Prototipo de función:

void drawMarker(InputOutputArray img, Point position, const Scalar& color,
                             int markerType = MARKER_CROSS, int markerSize=20, int thickness=1,
                             int line_type=8);

imges la imagen de entrada; positiones el origen del marcador; colores el color a dibujar; markerTypees el tipo de marcador; markerSizees el tamaño del marcador; thicknesses el ancho de la línea dibujada; line_typees el estilo de la línea dibujada.

Descripción de los tipos de marca :
Existen los siguientes tipos:

enum MarkerTypes
{
    
    
    MARKER_CROSS = 0,           //!< A crosshair marker shape
    MARKER_TILTED_CROSS = 1,    //!< A 45 degree tilted crosshair marker shape
    MARKER_STAR = 2,            //!< A star marker shape, combination of cross and tilted cross
    MARKER_DIAMOND = 3,         //!< A diamond marker shape
    MARKER_SQUARE = 4,          //!< A square marker shape
    MARKER_TRIANGLE_UP = 5,     //!< An upwards pointing triangle marker shape
    MARKER_TRIANGLE_DOWN = 6    //!< A downwards pointing triangle marker shape
};

ejemplo:

#include <opencv2/opencv.hpp>

int main() {
    
    
	cv::Mat img = cv::Mat::zeros(240, 240, CV_8UC3);

	cv::drawMarker(img, cv::Point(30, 30), cv::Scalar(0, 255, 0), cv::MarkerTypes::MARKER_CROSS);  //十字标记
	cv::drawMarker(img, cv::Point(60, 60), cv::Scalar(0, 0, 255), cv::MarkerTypes::MARKER_TILTED_CROSS);  //斜十字标记
	cv::drawMarker(img, cv::Point(90, 90), cv::Scalar(255, 0, 0), cv::MarkerTypes::MARKER_STAR);  //米字标记
	cv::drawMarker(img, cv::Point(120, 120), cv::Scalar(0, 255, 255), cv::MarkerTypes::MARKER_DIAMOND);  //菱形标记
	cv::drawMarker(img, cv::Point(150, 150), cv::Scalar(255, 255, 0), cv::MarkerTypes::MARKER_SQUARE);  //正方形标记
	cv::drawMarker(img, cv::Point(180, 180), cv::Scalar(255, 0, 255), cv::MarkerTypes::MARKER_TRIANGLE_UP);  //上三角标记
	cv::drawMarker(img, cv::Point(210, 210), cv::Scalar(0, 255, 0), cv::MarkerTypes::MARKER_TRIANGLE_DOWN);  //下三角标记
	cv::imshow("drawMarker", img);
	cv::waitKey();

	cv::destroyAllWindows();
	return 0;
}

Efecto:

Supongo que te gusta

Origin blog.csdn.net/weixin_43003108/article/details/127104539
Recomendado
Clasificación