COMUNICACIÓN = OPENCV + QR (spoiler, no es el que vamos a utilizar)

Tenemos un trabajo pendiente desde hace un tiempo. Nuestra flycase robotizada, que nos permitirá llevar material, cargas de mas de 100kg, pasar unas risas y avanzar en robótica.

El problema viene como nos comunicamos con la caja, para decirle las órdenes básicas

  • VEN
  • PARA
  • BAILA
  • SÍGUEME
  • etc.

Umm el cerebro que va a llevar a pesar de ser un OCTACORE con 2GB RAM (OdoridXU4) tampoco podemos pedirle mucho, la idea más sencilla sería mando, pero eso es poco soso y deja de ser un robot y se convierte en un coche teledirigido :S

La idea que se nos ha ocurrido son QR fáciles de detectar, rápidos, y nos da mucha versatilidad , así que manos a la obra, otra idea eran los colores, pero eso complica el procesamiento de la imagen, para controlar luz, lente sucia etc.

Pongo las funciones principales por no pegar todo el código que es un poco rollete, y ya lo subiré al GIT

Lo primero, librerías a saco, y por si fuera poco una propia para cosas como colores, controles de tiempo, etc.

#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <iostream>
#include <stdio.h>
#include "../00_include/tools.h"

La idea es capturar la imagen que viene de la cámara web y después buscar en ella un código QR, para luego interpretarlo

while (!fin)
	{
		cap.grab() ? :fin=true;
		cap.retrieve(img);
//Tratamiento de la imagen
/*
parte del contro de la lectura del QR
*/
		QRCodeDetector  qrDecoder =QRCodeDetector();

		vector<Point> points;
		if (qrDecoder.detect(img,points))
		{
			string decoded = qrDecoder.decode(img,points);
			drawQRCodeContour(img,points,decoded);
		}
		Point centroQR;
		posicionQR(points,centroQR);
    	circle(img, centroQR, 5, Scalar(0, 0, 255), -1);
		imshow (VIDEO,img);
		key = waitKey(wait);

Con QRCodeDetector qrDecoder = QRCodeDetector(); obtenemos el objeto que nos permitirá trabajar y obtener información, básicamente los puntos donde está el código QR y su contenido.

La función drawQRCodeContour dibuja un contorno alrededor del QR si se encuentran puntos y el texto no está vacío. También guarda la región de interés (ROI).

void drawQRCodeContour(Mat& color_image, vector<Point> pts, string url)
{
	if (!pts.empty() && url!="")
	{
	
		RNG rng(1000);
		Rect roi = boundingRect(pts);
		rectangle(color_image,roi,RED);
		for (size_t i = 0; i < 4; i++)
		{
			Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
			circle(color_image, pts[i], 6.5, color, FILLED, LINE_AA);
		}

		putText(color_image, url, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(0, 0, 255), 1, LINE_AA);
	}
}

void posicionQR(vectorpts, Point& centroQR)
Ahora viene la miga, que es poca cosa, pero necesitamos saber dónde está el código QR para que en el futuro movamos la ruedas, con el fin de tener el QR centrado en la imagen , y según el área que ocupe el código QR podrá estar más cerca o lejos.

void posicionQR(vector<Point>pts, Point& centroQR)
{
centroQR.x = 0;
    centroQR.y = 0;

    for (const auto& pt : pts) {
        centroQR.x += pt.x;
        centroQR.y += pt.y;
    }

    centroQR.x /= 4;
    centroQR.y /= 4;
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

19 + diez =

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.