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:
LINE_8 = 8 líneas procesadas por el algoritmo de Bresenham basado en conexiones de 4 vecindarios.
Efecto:
LINE_AA = 16 Suavizado de filtro gaussiano basado en la línea recta.
Efecto:
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);
img
es la imagen de entrada; center
es el centro del círculo dibujado; radius
es el radio del círculo dibujado; color
es el color dibujado; thickness
es el ancho de la línea dibujada; lineType
es el estilo de la línea dibujada; shift
desplazamiento.
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);
img
es la imagen de entrada; color
es el color que se dibujará; thickness
es el ancho de línea que se dibujará; lineType
es el estilo de línea shift
que se dibujará;
Función prototipo 2:
void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color,
int thickness = 1, int lineType = LINE_8);
img
es la imagen de entrada; color
es el color que se dibujará; thickness
es el ancho de línea que se dibujará; lineType
es el estilo de línea shift
que se dibujará;
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);
img
es la imagen de entrada; pt1
es un punto final de la línea; pt2
es el otro punto final de la línea; color
es el color dibujado; thickness
es el ancho de la línea dibujada; lineType
es el estilo de la línea dibujada; shift
el desplazamiento.
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.
img
es la imagen de entrada; pts
es el conjunto de puntos de entrada; isClosed
la bandera indica si el conjunto de puntos está cerrado; color
es el color para dibujar; thickness
es el ancho de línea para dibujar; lineType
es el estilo de línea para dibujar; shift
desplazamiento.
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.
img
es la imagen de entrada; pt1
es el punto superior izquierdo del rectángulo; pt2
es el punto inferior derecho del rectángulo; color
es el color que se dibujará; thickness
es el ancho de línea que se dibujará; lineType
es el estilo de línea que se dibujará; shift
desplazamiento.
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.
img
es la imagen de entrada; points
es el conjunto de puntos de entrada; color
es el color para dibujar; thickness
es el ancho de línea para dibujar; lineType
es el estilo de línea para dibujar; shift
desplazamiento.
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 );
img
es la imagen de entrada; es text
el texto a dibujar; es org
el punto de referencia del texto dibujado; fontFace
es el estilo de texto del texto dibujado ; es fontScale
el 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:color
thickness
lineType
bottomLeftOrigin
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:
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.
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);
img
es la imagen de entrada; pt1
es el punto inicial del segmento de la línea de flecha; pt2
es el punto final del segmento de la línea de flecha; color
es el color dibujado; thickness
es el ancho de la línea dibujada; line_type
es el estilo de la línea dibujada; shift
es el desplazamiento; tipLength
es 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);
img
es la imagen de entrada; position
es el origen del marcador; color
es el color a dibujar; markerType
es el tipo de marcador; markerSize
es el tamaño del marcador; thickness
es el ancho de la línea dibujada; line_type
es 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: