Visión artificial (4) -Aplicación de visión artificial

Visión artificial (4) -Aplicación de visión artificial

Uno, reconocimiento facial

El reconocimiento facial necesita determinar la posición, el tamaño y la postura del rostro (si existe) en la imagen de entrada y, a menudo, se utiliza en aplicaciones como el reconocimiento biométrico, el monitoreo de video y la interacción persona-computadora. En 2001, Viola y Jones propusieron un algoritmo de detección de objetos clasificador en cascada basado en las características de Haar, que fue mejorado por Lienhart y Maydt en 2002, proporcionando un método eficaz para aplicaciones de detección de rostros rápidas y confiables. OpenCV ha integrado la implementación de código abierto del algoritmo, utilizando las características de Haar de una gran cantidad de muestras para el entrenamiento del clasificador y luego llamando a la cascada del clasificador en cascada entrenado para la coincidencia de patrones.
El algoritmo de reconocimiento facial en OpenCV primero convierte la imagen adquirida a escala de grises y realiza procesamiento de bordes y filtrado de ruido; luego, la imagen se reduce, el histograma se ecualiza y el clasificador coincidente se agranda por el mismo múltiplo hasta que coincide con el clasificador. Si el tamaño es mayor que la imagen detectada, se devolverá el resultado coincidente. En el proceso de emparejamiento, el emparejamiento se puede realizar de acuerdo con diferentes tipos en el clasificador en cascada, como la cara frontal y la cara lateral.
OpenCV ha integrado el algoritmo de reconocimiento facial, solo es necesario llamar a la interfaz correspondiente de OpenCV para realizar la función de reconocimiento facial.
Realización del código fuente
1. Parte de
inicialización La parte de inicialización completa principalmente la configuración de los nodos ROS, las imágenes y los parámetros de reconocimiento.

def __init__(self):
        rospy.on_shutdown(self.cleanup);
 
        # 创建cv_bridge
        self.bridge = CvBridge()
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
 
        # 获取haar特征的级联表的XML文件,文件路径在launch文件中传入
        cascade_1 = rospy.get_param("~cascade_1", "")
        cascade_2 = rospy.get_param("~cascade_2", "")
 
        # 使用级联表初始化haar特征检测器
        self.cascade_1 = cv2.CascadeClassifier(cascade_1)
        self.cascade_2 = cv2.CascadeClassifier(cascade_2)
 
        # 设置级联表的参数,优化人脸识别,可以在launch文件中重新配置
        self.haar_scaleFactor  = rospy.get_param("~haar_scaleFactor", 1.2)
        self.haar_minNeighbors = rospy.get_param("~haar_minNeighbors", 2)
        self.haar_minSize      = rospy.get_param("~haar_minSize", 40)
        self.haar_maxSize      = rospy.get_param("~haar_maxSize", 60)
        self.color = (50, 255, 50)
 
        # 初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射
        self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)

2.Función de devolución de llamada de imagen ROS Después de
recibir los datos de imagen RGB liberados por la cámara, el nodo de rutina ingresa a la función de devolución de llamada, convierte la imagen en formato de datos OpenCV y luego comienza a llamar a la función de reconocimiento facial después del preprocesamiento, y finalmente publica el reconocimiento resultado.

def image_callback(self, data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")     
            frame = np.array(cv_image, dtype=np.uint8)
        except CvBridgeError, e:
            print e
 
        # 创建灰度图像
        grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
        # 创建平衡直方图,减少光线影响
        grey_image = cv2.equalizeHist(grey_image)
 
        # 尝试检测人脸
        faces_result = self.detect_face(grey_image)
 
        # 在opencv的窗口中框出所有人脸区域
        if len(faces_result)>0:
            for face in faces_result: 
                x, y, w, h = face
                cv2.rectangle(cv_image, (x, y), (x+w, y+h), self.color, 2)
 
        # 将识别后的图像转换成ROS消息并发布
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))

3.
Reconocimiento facial El reconocimiento facial llama directamente a la interfaz de reconocimiento facial proporcionada por OpenCV para que coincida con los rasgos faciales en la base de datos.

def detect_face(self, input_image):
        # 首先匹配正面人脸的模型
        if self.cascade_1:
            faces = self.cascade_1.detectMultiScale(input_image, 
                    self.haar_scaleFactor, 
                    self.haar_minNeighbors, 
                    cv2.CASCADE_SCALE_IMAGE, 
                    (self.haar_minSize, self.haar_maxSize))
                                         
        # 如果正面人脸匹配失败,那么就尝试匹配侧面人脸的模型
        if len(faces) == 0 and self.cascade_2:
            faces = self.cascade_2.detectMultiScale(input_image, 
                    self.haar_scaleFactor, 
                    self.haar_minNeighbors, 
                    cv2.CASCADE_SCALE_IMAGE, 
                    (self.haar_minSize, self.haar_maxSize))
        
        return faces

Hay algunos parámetros y nombres de temas en el código que deben configurarse en el archivo de inicio, por lo que también debe escribir un archivo de inicio para ejecutar la rutina.

<launch>
    <node pkg="test2" name="face_detector" type="face_detector.py" output="screen">
        <remap from="input_rgb_image" to="/usb_cam/image_raw" />
        <rosparam>
            haar_scaleFactor: 1.2
            haar_minNeighbors: 2
            haar_minSize: 40
            haar_maxSize: 60
        </rosparam>
        <param name="cascade_1" value="$(find robot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml" />
        <param name="cascade_2" value="$(find robot_vision)/data/haar_detectors/haarcascade_profileface.xml" />
    </node>
</launch>

2. Seguimiento de objetos

El seguimiento de objetos y el reconocimiento de objetos tienen similitudes, y se utiliza el mismo método de detección de puntos característicos, pero el enfoque es diferente. El objeto para el reconocimiento de objetos puede ser estático o dinámico, y el modelo establecido en función de los puntos característicos del objeto se utiliza como base de datos para el reconocimiento; el seguimiento de objetos enfatiza el posicionamiento preciso de la posición del objeto, y la imagen de entrada generalmente necesita tienen características dinámicas.
La función de seguimiento de objetos primero muestra los puntos característicos del objeto en el cuadro actual de la imagen de acuerdo con el flujo de imagen de entrada y el objeto seleccionado que se va a rastrear; luego compara el valor de gris del cuadro actual y el siguiente cuadro para estimar las características del objeto rastreado en el fotograma actual La posición del punto en el siguiente fotograma de la imagen; luego filtre los puntos característicos con la misma posición, los puntos restantes son los puntos característicos del objeto de rastreo en el segundo fotograma de la imagen, y el El grupo de puntos característicos es la ubicación del objeto de seguimiento. Esta función todavía se basa en el algoritmo de procesamiento de imágenes proporcionado por OpenCV.
Intente elegir un objeto de prueba con un fondo de color sólido y una gran diferencia de color. Mueva el objeto reconocido en la pantalla, puede ver que el marco rectangular identifica la posición en tiempo real del objeto en movimiento, y el área de reconocimiento, el umbral y otros parámetros se pueden ajustar para el entorno experimental.
Realización del código fuente
1. Parte de
inicialización La parte de inicialización completa principalmente la configuración de los nodos ROS, las imágenes y los parámetros de reconocimiento.

def __init__(self):
        rospy.on_shutdown(self.cleanup);
 
        # 创建cv_bridge
        self.bridge = CvBridge()
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
 
        # 设置参数:最小区域、阈值
        self.minArea   = rospy.get_param("~minArea",   500)
        self.threshold = rospy.get_param("~threshold", 25)
 
        self.firstFrame = None
        self.text = "Unoccupied"
 
        # 初始化订阅rgb格式图像数据的订阅者,此处图像topic的话题名可以在launch文件中重映射
        self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)

2.Después de que el
nodo de la rutina de procesamiento de imágenes recibe los datos de imagen RGB liberados por la cámara, ingresa a la función de devolución de llamada para convertir la imagen en formato OpenCV; después de que se completa el preprocesamiento de la imagen, se comparan los dos cuadros de imágenes y el objeto en movimiento se identifica en función de la diferencia de imagen, para identificar los resultados del reconocimiento y publicarlos.

def image_callback(self, data):
        # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")     
            frame = np.array(cv_image, dtype=np.uint8)
        except CvBridgeError, e:
            print e
 
        # 创建灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (21, 21), 0)
 
        # 使用两帧图像做比较,检测移动物体的区域
        if self.firstFrame is None:
            self.firstFrame = gray
            return  
        frameDelta = cv2.absdiff(self.firstFrame, gray)
        thresh = cv2.threshold(frameDelta, self.threshold, 255, cv2.THRESH_BINARY)[1]
 
        thresh = cv2.dilate(thresh, None, iterations=2)
        binary, cnts, hierarchy= cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 
        for c in cnts:
            # 如果检测到的区域小于设置值,则忽略
            if cv2.contourArea(c) < self.minArea:
               continue 
 
            # 在输出画面上框出识别到的物体
            (x, y, w, h) = cv2.boundingRect(c)
            cv2.rectangle(frame, (x, y), (x + w, y + h), (50, 255, 50), 2)
            self.text = "Occupied"
 
        # 在输出画面上打当前状态和时间戳信息
        cv2.putText(frame, "Status: {}".format(self.text), (10, 20),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
 
        # 将识别后的图像转换成ROS消息并发布
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(frame, "bgr8"))

Hay algunos parámetros y nombres de temas en el código que deben configurarse en el archivo de inicio, por lo que también debe escribir un archivo de inicio para ejecutar la rutina.

<launch>
    <node pkg="test2" name="motion_detector" type="motion_detector.py" output="screen">
        <remap from="input_rgb_image" to="/usb_cam/image_raw" />
        <rosparam>
            minArea: 500
            threshold: 25
        </rosparam>
    </node>
</launch>

Tres, reconocimiento de código QR

Los códigos bidimensionales se utilizan cada vez más en escenas de la vida, ya sea de compras en centros comerciales o de compartir bicicletas, los códigos bidimensionales se han utilizado ampliamente como señal de entrada. ROS proporciona una variedad de paquetes de funciones de reconocimiento de códigos QR- (ar_track_alvar)
1. Paquete de funciones ar_track_alvar
La instalación del paquete de funciones ar_track_alvar es muy simple, solo use el siguiente comando:

sudo apt-get install ros-kinetic-ar-track-alvar

Una vez completada la instalación, busque el paquete de funciones ar_track_alvar en el directorio de instalación predeterminado de ROS. Abra la carpeta de inicio en el paquete de funciones, puede ver varios archivos de inicio. Estas son las rutinas de reconocimiento de códigos QR que utiliza el robot PR2, que se pueden modificar en base a estos archivos, para que su visión artificial tenga la función de reconocimiento de códigos QR.
2. Crear código QR El
paquete de funciones ar_track_alvar proporciona la función de generar etiquetas de código QR. Puede utilizar los siguientes comandos para crear etiquetas de código QR con las etiquetas correspondientes:

rosrun ar_track_alvar createMarker AR_ID

El AR_ID puede ser cualquier número del 0 al 65535, por ejemplo:

rosrun ar_track_alvar createMarker 0

Puede crear una imagen de etiqueta de código QR con una etiqueta de 0, nombrarla MarkerData_0.png y colocarla debajo de la ruta actual del terminal. También puede utilizar directamente el visor de imágenes del sistema para abrir el archivo de código QR.
La herramienta createMarker también tiene muchos parámetros que se pueden configurar. Utilice el siguiente comando para ver la ayuda.

rosrun ar_track_alvar createMarker

createMarker no solo puede usar etiquetas digitales para generar etiquetas de código QR, sino también usar cadenas, nombres de archivo, URL, etc., y también puede usar el parámetro -s para establecer el tamaño del código QR generado.
Puede utilizar los siguientes comandos para crear una serie de etiquetas de código QR:

roscd robot_vision/config
rosrun ar_track_alvar createMarker -s 5 0
rosrun ar_track_alvar createMarker -s 5 1
rosrun ar_track_alvar createMarker -s 5 2

3. El
paquete de funciones de código QR de reconocimiento de cámara ar_track_alvar admite una cámara USB o una cámara RGB-D como sensor visual para reconocer el código QR, correspondiente a los dos nodos de reconocimiento diferentes de individualNoKinect e individualMarkers respectivamente.
4. Kinect reconoce
códigos bidimensionales Las cámaras RGB-D como Kinect también se pueden utilizar para reconocer códigos bidimensionales.

Cuarto, reconocimiento de objetos

ROS integra un potente marco de reconocimiento de objetos: Object Recognition Kitchen (ORK), que contiene una variedad de métodos de reconocimiento de objetos tridimensionales.
1. Paquete de funciones ORK
La operación se realiza en Ubuntu 16.04 Dado que esta versión de kinetic no integra todos los paquetes de funciones ORK, se requieren los siguientes pasos para instalar el código fuente.
Primero instale las bibliotecas dependientes usando el siguiente comando:

sudo apt-get install meshlab
sudo apt-get install libosmesa6-dev
sudo apt-get install python-pyside.qtcore
sudo apt-get install python-pyside.qtgui

Descargue el archivo rosinstall y compile el
enlace del archivo: https://github.com/wg-perception/object_recognition_core
Inserte la descripción de la imagen aquí
Cree un nuevo espacio de trabajo ork_ws, descargue el archivo ork.rosinstall.kinetic.plus directamente en ork_ws y luego proceda de la siguiente manera:

cd ork_ws
wstool init src [文件路径]/ork.rosinstall.kinetic.plus

Descargar el código fuente de la función:

cd src
wstool update -j8
git clone https://github.com/jbohren/xdot.git
cd ..
rosdep install --from-paths src -i -y

Compilar:

cd ork_ws
catkin_make

Proceso de reconocimiento de objetos:
(1) Cree un modelo de objeto que necesite ser reconocido
(2) Entrene el modelo para generar un modelo de reconocimiento
(3) Utilice el modelo de reconocimiento entrenado para el reconocimiento de objetos
2. Cree una biblioteca de modelos de objetos
Cree una base de datos
Instale CouchDB herramientas:

sudo apt-get install couchdb

Pruebe si la instalación es exitosa:

curl -X GET http://localhost:5984

Cree una pieza de datos del modelo de Coca-Cola:

rosrun object_recognition_core object_add.py -n "coke " -d "A universal can of coke " --commit

Inserte la descripción de la imagen aquí
Cargue el modelo 3D
Descargue el modelo coke.stl existente y descárguelo a través de github:

git clone https://github.com/wg-perception/ork_tutorials

Descargue al archivo src;
luego cargue el modelo de Coke en la base de datos:

rosrun object_recognition_core mesh_add.py 49cce25ad1745bc78d8c16a90200008e [path]/ork_tutorials/data/coke.stl --commit

Ver el modelo:

sudo pip install git+https://github.com/couchapp/couchapp.git
rosrun object_recognition_core push.sh

Inserte la descripción de la imagen aquí
Haga clic en object_listing:
Inserte la descripción de la imagen aquí
haga clic en mallas:
Inserte la descripción de la imagen aquí
3. Entrenamiento de modelos
Hay muchos modelos cargados en la base de datos, y necesitamos entrenarnos para generar plantillas coincidentes.
El comando es el siguiente:

sudo object_recognition_core training -c `rospack find object_recognition_linemod`/conf/training.ork

4. Reconocimiento de objetos tridimensionales

Supongo que te gusta

Origin blog.csdn.net/weixin_45661757/article/details/113257306
Recomendado
Clasificación