Raspberry Pi - Autostart OpenCv-Script - Error con cv :: imshow ()

Breve descripción:

Quiero iniciar automáticamente un ejecutable (archivo binario opencv, generar a través de c ++) a través de un script de servicio systemd después del arranque, pero no tengo éxito.

Reduje el error a la declaración de código "cv :: imshow (....)" que abre una ventana y muestra una imagen. En este punto, el código arroja el error: "QXcbConnection: No se pudo conectar a la pantalla"

Sin embargo, si ejecuto manualmente el script sh o el binario, ambos funcionan bien. Busqué en stackoverflow los errores más comunes e intenté arreglar todo lo que pude encontrar. Estoy bastante seguro de que:

Mi archivo de servicio realmente se ejecuta al inicio (hasta que se produjo el error)La ejecución manual del archivo binario funciona bienLa ejecución manual del script .sh funciona bienNo tengo errores de enlace de tiempo de ejecución (ver .sh-script)

Apreciaría cualquier ayuda. Ayúdame a corregir el error y explícame por qué este error incluso ocurre en primer lugar. Muchas gracias :)

.

Mi sistema:

Machine: Raspberry Pi 3 Model B
Architecture: arm32 / ARMv7
OS: NOOBS

.

Mi script en / etc / systemd / system / (test.service):

[Unit]
Description=lalala

[Service]
Type=oneshot
ExecStart=/bin/bash "/home/pi/Desktop/test.sh" start
ExecStop=/bin/bash "/home/pi/Desktop/test.sh" stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Además, ejecuté los siguientes comandos:

sudo chmod u+rwx /etc/systemd/system/test.service

sudo systemctl enable test

Y si inicio el servicio manualmente, se ejecuta con la misma salida de error que durante el inicio automático durante el proceso de arranque:

sudo systemctl enable test

.

Mi script de shell (test.sh):

#!/bin/sh -e

exec 2> /tmp/test.sh.log       # send stderr to a log file
exec 1>&2                      # send stdout to the same log file
set -x                         # tell sh to display commands before execution


echo "in script"


start() 
{
    echo "in start"

    sleep 30

    LD_LIBRARY_PATH=/usr/local/OpenCV/lib:/usr/local/SFML/lib:/usr/local/curl/lib:$LD_LIBRARY_PATH
    export LD_LIBRARY_PATH

    /home/pi/Desktop/test/main -e &
}


# THE OTHER CASES, NOT PUT IN HERE (stop, status)


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status 
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac

exit 0

.

Ejemplo mínimo de mi código fuente: (ejecutable)

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
    cv::Mat frame;
    cv::namedWindow("result", cv::WINDOW_NORMAL);

    ## CRASH

    return 0;
}

.

PD:

Soy consciente de que hay un hilo similar como este (Ejecute el script OpenCV al inicio con imshow) Pero como no hay solución para esta pregunta, y como tengo más información para compartir, pensé que sería más apropiado comenzar un nuevo hilo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta