No puedo obtener cv :: line para dibujar una línea antialias con las marcas CV_AA establecidas. Aquí es código de ejemplo para ilustrar:Al dibujar una línea en OpenCV con marcas CV_AA no se produce una línea antialias
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
int main(int argc, char* argv[])
{
cv::Mat base(100, 100, CV_32F);
cv::Point2i p1(20, 20);
cv::Point2i p2(70, 90);
cv::line(base, p1, p2, cv::Scalar(1.0), 1, CV_AA); // 1 pixel thick, CV_AA == Anti-aliased flag
cv::namedWindow("line test", CV_NORMAL);
cv::imshow("line test", base);
cv::waitKey(0);
return 0;
}
He intentado usar cv :: POINT2D en lugar de cv :: Point2i y no encontró diferencias. (i == entero, d == doble) También intenté hacer que el ancho del píxel fuera mayor que 1, pero todavía no hay AA.
Sin embargo, esto sí funciona con una imagen CV_8U (8 bits sin signo), en oposición a la imagen CV_32F (flotador de 32 bits) que tengo aquí. (Para CV_8U, debe pasar cv :: Scalar (255) en lugar de cv :: Scalar (1.0) en la función de línea para comparar)
Supongo que una solución alternativa sería comenzar con una imagen CV_8U luego convertir, pero ¿hay una manera directa de hacerlo con solo una imagen CV_32F que no requiere que escriba mi propia función anti-aliasing?
¿Echo de menos algo?
docs OpenCV: cv::line reference
Puede ser un problema en OpenCV, pero quiero señalarle un código extraño: puede mover el bucle exterior cv :: namedWindow y cv :: imshow, manteniendo la misma funcionalidad para una velocidad mucho mejor. – Sam
Ah, sí, buen punto. Tiré eso para la pregunta. –
en realidad, puede escribir c = cv :: waitKey(); return 0; Cuando presione una tecla, waitKey() regresará y cerrará el programa. – Sam