Počítačové vidění

Ucelené projekty, návody a postupy.
kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Počítačové vidění

Příspěvek od kiklhorn »

Uplatnění vidím v oblastech
- Optické čtení analogových měřáků
- Rozpoznávání osob (a na to navázané třeba scény, provázání se spotify a další)
- Rozpoznávání značek aut - ať se otevře garáž

Malá odbočka - Pro čtení plynoměru GK4 je jednoduché řešení co poradil Pete30 - impulzní snímač - viewtopic.php?p=2243#p2243 Tu prohlubeň na magnetické čidlo tam mám také :D

Posledních pár dní (mj. ve snaze naučit se trochu Python) si hraju s počítačovým viděním.

Začal jsem s instalací Frigate NVR, které umí rozpoznávat mnoho různých předmětů, do Home Assistenta a Raspberry to stíhá bez zadýchání.
Měl jsem pocit že jsem viděl k tomu i něco v češtině, ale asi se pletu.


Číslo z číselníku z Frigate asi nedostanu, tak jsem se pustil cestou OpenCV
Jako zajímavý zdroj informací včetně kurzů na YT https://www.computervision.zone/

Mám tu pár nevyužitých kamer ESP32-Cam
Chtěl bych dosáhnout toho aby kamera nasnímala nějaký ten číselník a poslala jej do HA.
Případně poslala jen obraz samotného číselníku, a úplně nejlépe jen číslo přes MQTT, ale to už je asi v oblasti sci-fi vzhledem k velikosti paměti ESP a mým nulovým zkušenostem.
V každém případě někde musí proběhnout rozpoznání obrazu a jako výsledek vypadnout číslo.

Momentálně mám ESP32-CAM na powerbance, připnutou kolíčkem na prádlo aby alespoň nějak viděla na plynoměr a nahraný přes arduino ide kód z https://bitsnblobs.com/rtsp-video-streamer---esp32/ (odkaz na git má úplně dole)
mírně upravený- doplnil jsem tam 2 řádky pro ignorování podpětí ( nastane u mne při nabíhání wifi, napájím to dlouhými ustřihanými usb kablíky s tak tenoučkými drátky ...)

Kód: Vybrat vše

#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h"  //disable brownout problems
a dva řádky začínající

Kód: Vybrat vše

 digitalWrite(4, 
- natvrdo bez detekce typu desky, rozsvěcím si LEDku na kameře jen po dobu kdy jsem k ní připojený.

Kód: Vybrat vše

/****************************************************************************************************************************************************
 *  TITLE: HOW TO BUILD A $9 RSTP VIDEO STREAMER: Using The ESP-32 CAM Board || Arduino IDE - DIY #14
 *  DESCRIPTION: This sketch creates a video streamer than uses RTSP. You can configure it to either connect to an existing WiFi network or to create
 *  a new access point that you can connect to, in order to stream the video feed.
 *
 *  By Frenoy Osburn
 *  YouTube Video: https://youtu.be/1xZ-0UGiUsY
 *  BnBe Post: https://www.bitsnblobs.com/rtsp-video-streamer---esp32
 ****************************************************************************************************************************************************/

  /********************************************************************************************************************
 *  Board Settings:
 *  Board: "ESP32 Wrover Module"
 *  Upload Speed: "921600"
 *  Flash Frequency: "80MHz"
 *  Flash Mode: "QIO"
 *  Partition Scheme: "Hue APP (3MB No OTA/1MB SPIFFS)"
 *  Core Debug Level: "None"
 *  COM Port: Depends *On Your System*
 *********************************************************************************************************************/
 
#include "src/OV2640.h"
#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>

#include "src/SimStreamer.h"
#include "src/OV2640Streamer.h"
#include "src/CRtspSession.h"
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h"  //disable brownout problems
//#define ENABLE_OLED //if want use oled ,turn on thi macro
//#define SOFTAP_MODE // If you want to run our own softap turn this on
#define ENABLE_WEBSERVER
#define ENABLE_RTSPSERVER

#ifdef ENABLE_OLED
#include "SSD1306.h"
#define OLED_ADDRESS 0x3c
#define I2C_SDA 14
#define I2C_SCL 13
SSD1306Wire display(OLED_ADDRESS, I2C_SDA, I2C_SCL, GEOMETRY_128_32);
bool hasDisplay; // we probe for the device at runtime
#endif

// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER

#include "camera_pins.h"

OV2640 cam;

#ifdef ENABLE_WEBSERVER
WebServer server(80);
#endif

#ifdef ENABLE_RTSPSERVER
WiFiServer rtspServer(8554);
#endif


#ifdef SOFTAP_MODE
IPAddress apIP = IPAddress(192, 168, 1, 1);
#else
#include "wifikeys.h"
#endif

#ifdef ENABLE_WEBSERVER
void handle_jpg_stream(void)
{
    WiFiClient client = server.client();
    String response = "HTTP/1.1 200 OK\r\n";
    response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
    server.sendContent(response);

    while (1)
    {
        cam.run();
        if (!client.connected())
            break;
        response = "--frame\r\n";
        response += "Content-Type: image/jpeg\r\n\r\n";
        server.sendContent(response);

        client.write((char *)cam.getfb(), cam.getSize());
        server.sendContent("\r\n");
        if (!client.connected())
            break;
    }
}

void handle_jpg(void)
{
    WiFiClient client = server.client();

    cam.run();
    if (!client.connected())
    {
        return;
    }
    String response = "HTTP/1.1 200 OK\r\n";
    response += "Content-disposition: inline; filename=capture.jpg\r\n";
    response += "Content-type: image/jpeg\r\n\r\n";
    server.sendContent(response);
    client.write((char *)cam.getfb(), cam.getSize());
}

void handleNotFound()
{
    String message = "Server is running!\n\n";
    message += "URI: ";
    message += server.uri();
    message += "\nMethod: ";
    message += (server.method() == HTTP_GET) ? "GET" : "POST";
    message += "\nArguments: ";
    message += server.args();
    message += "\n";
    server.send(200, "text/plain", message);
}
#endif

void lcdMessage(String msg)
{
  #ifdef ENABLE_OLED
    if(hasDisplay) {
        display.clear();
        display.drawString(128 / 2, 32 / 2, msg);
        display.display();
    }
  #endif
}

void setup()
{
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
  #ifdef ENABLE_OLED
    hasDisplay = display.init();
    if(hasDisplay) {
        display.flipScreenVertically();
        display.setFont(ArialMT_Plain_16);
        display.setTextAlignment(TEXT_ALIGN_CENTER);
    }
  #endif
    lcdMessage("booting");

    Serial.begin(115200);
    //while (!Serial);            //wait for serial connection. 

    camera_config_t config;
    config.ledc_channel = LEDC_CHANNEL_0;
    config.ledc_timer = LEDC_TIMER_0;
    config.pin_d0 = Y2_GPIO_NUM;
    config.pin_d1 = Y3_GPIO_NUM;
    config.pin_d2 = Y4_GPIO_NUM;
    config.pin_d3 = Y5_GPIO_NUM;
    config.pin_d4 = Y6_GPIO_NUM;
    config.pin_d5 = Y7_GPIO_NUM;
    config.pin_d6 = Y8_GPIO_NUM;
    config.pin_d7 = Y9_GPIO_NUM;
    config.pin_xclk = XCLK_GPIO_NUM;
    config.pin_pclk = PCLK_GPIO_NUM;
    config.pin_vsync = VSYNC_GPIO_NUM;
    config.pin_href = HREF_GPIO_NUM;
    config.pin_sscb_sda = SIOD_GPIO_NUM;
    config.pin_sscb_scl = SIOC_GPIO_NUM;
    config.pin_pwdn = PWDN_GPIO_NUM;
    config.pin_reset = RESET_GPIO_NUM;
    config.xclk_freq_hz = 20000000;
    config.pixel_format = PIXFORMAT_JPEG;
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12; 
    config.fb_count = 2;       
  
    #if defined(CAMERA_MODEL_ESP_EYE)
      pinMode(13, INPUT_PULLUP);
      pinMode(14, INPUT_PULLUP);
    #endif

    #if defined(CAMERA_MODEL_AI_THINKER)
      pinMode(4, OUTPUT);
    #endif
  
    cam.init(config);
    
    IPAddress ip;

#ifdef SOFTAP_MODE
    const char *hostname = "devcam";
   // WiFi.hostname(hostname); // FIXME - find out why undefined
    lcdMessage("starting softAP");
    WiFi.mode(WIFI_AP);
    
    bool result = WiFi.softAP(hostname, "12345678", 1, 0);
    delay(2000);
    WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
    
    if (!result)
    {
        Serial.println("AP Config failed.");
        return;
    }
    else
    {
        Serial.println("AP Config Success.");
        Serial.print("AP MAC: ");
        Serial.println(WiFi.softAPmacAddress());

        ip = WiFi.softAPIP();

        Serial.print("Stream Link: rtsp://");
        Serial.print(ip);
        Serial.println(":8554/mjpeg/1");
    }
#else
    lcdMessage(String("join ") + ssid);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(F("."));
    }
    ip = WiFi.localIP();
    Serial.println(F("WiFi connected"));
    Serial.println("");
    Serial.println(ip);
    Serial.print("Stream Link: rtsp://");
    Serial.print(ip);
    Serial.println(":8554/mjpeg/1");
#endif

    lcdMessage(ip.toString());

#ifdef ENABLE_WEBSERVER
    server.on("/", HTTP_GET, handle_jpg_stream);
    server.on("/jpg", HTTP_GET, handle_jpg);
    server.onNotFound(handleNotFound);
    server.begin();
#endif

#ifdef ENABLE_RTSPSERVER
    rtspServer.begin();
#endif
}

CStreamer *streamer;
CRtspSession *session;
WiFiClient client; // FIXME, support multiple clients

void loop()
{
#ifdef ENABLE_WEBSERVER
    server.handleClient();
#endif

#ifdef ENABLE_RTSPSERVER
    uint32_t msecPerFrame = 100;
    static uint32_t lastimage = millis();

    // If we have an active client connection, just service that until gone
    // (FIXME - support multiple simultaneous clients)
    if(session) {
        digitalWrite(4, HIGH);
        session->handleRequests(0); // we don't use a timeout here,
        // instead we send only if we have new enough frames

        uint32_t now = millis();
        if(now > lastimage + msecPerFrame || now < lastimage) { // handle clock rollover
            session->broadcastCurrentFrame(now);
            lastimage = now;
            // check if we are overrunning our max frame rate
            now = millis();
            if(now > lastimage + msecPerFrame)
                printf("warning exceeding max frame rate of %d ms\n", now - lastimage);
        }

        if(session->m_stopped) {
            digitalWrite(4, LOW);
            delete session;
            delete streamer;
            session = NULL;
            streamer = NULL;
        }
    }
    else {
        client = rtspServer.accept();

        if(client) {
            //streamer = new SimStreamer(&client, true);             // our streamer for UDP/TCP based RTP transport
            streamer = new OV2640Streamer(&client, cam);             // our streamer for UDP/TCP based RTP transport

            session = new CRtspSession(&client, streamer); // our threads RTSP session and state
        }
    }
#endif
}
A mám za sebou první krok - detekuji červenou oblast číselníku. Jak na fotce, tak na streamu z kamery která není umístěna vůbec ideálně.
Přílohy
CteniPlynomeru.jpg
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Počítačové vidění

Příspěvek od kiklhorn »

Dělám věci občas trochu napřeskáčku. Zvlášť když vím že mi chybí potřebné díly/znalosti/informace. Ono nakonec vše do sebe nějak zapadne.

Teď vynechávám automatické rozpoznání (špatné světelné podmínky + prozatímní nedostatek znalostí možností filtrů)
a ručně definuji oblast číselníku (což s relativně pevně umístěnou kamerou by nemusel být problém - zapsat ručně pár změřených souřadnic do nějakého ini/yaml souboru)

Počítám s tím že kamera prostě nebude umístěna přímo zepředu před číselníkem, takže potřebuji obraz přepočítat abych dostal číselník jako by kamera přímo před ním byla.


Teď v reálném čase dostávám jako výstup číselník narovnaný do správné perspektivy.
WarpPlynomer.jpg
Kod mam ve dvou souborech, takze kdo si chce hrat tady jsou:
Poznamky
- na zacatku smycky odkomentovat/zakomentovat img= pro video(nyni) nebo obrazek jako zdroj
stackImages je jen pro vykresleni obrazků, stejny pocet obrazku v kazdem radku.
([obr1, obr2],
[obr3, obr4])

ciselnik.py:

Kód: Vybrat vše

## Z nejakeho autodetekvniho kodu bych mel dostat souradnice ctyr bodu definujicich rohy ciselniku
# To mi zatim nejde
# Takze tady to udelam rucne pomoci posuvniku (umim) nebo mysi (jeste neumim)

import cv2 as cv
import numpy as np
from pomocne import rescaleFrame, stackImages, reorder, empty

#######################################################################
path = '../Resources/Photos/PlynElsterDSC_4888.jpg'
cap = cv.VideoCapture('rtsp://192.168.199.241:8554/mjpeg/1')

frameWidth, frameHeight = 640, 480
widthImg, heightImg  = 640, 120
color = (255,0,255)
##########################################################################
def getWarp(img, shape):
    pts1 = np.float32(shape)
    pts2 = np.float32([[0, 0], [widthImg, 0], [0, heightImg], [widthImg, heightImg]])
    matrix = cv.getPerspectiveTransform(pts1, pts2)
    imgOutput = cv.warpPerspective(img, matrix, (widthImg, heightImg))

    imgCropped = imgOutput[20:imgOutput.shape[0] - 20, 20:imgOutput.shape[1] - 20] #pripadne orezani okraju
    # imgCropped = cv.resize(imgCropped, (widthImg, heightImg)) # nebo zmena rozmeru

    return imgCropped

cv.namedWindow("TrackBars")
cv.resizeWindow("TrackBars", 640, 480)
cv.createTrackbar("LDx", "TrackBars", 132, 480, empty)
cv.createTrackbar("PDx", "TrackBars", 457, 480, empty)
cv.createTrackbar("LDy", "TrackBars", 571, 640, empty)
cv.createTrackbar("PDy", "TrackBars", 504, 640, empty)
cv.createTrackbar("LHx", "TrackBars", 127, 480, empty)
cv.createTrackbar("PHx", "TrackBars", 450, 480, empty)
cv.createTrackbar("LHy", "TrackBars", 527, 640, empty)
cv.createTrackbar("PHy", "TrackBars", 469, 640, empty)

while True:
    # imgorigBGR = cv.imread(path)
    isTrue, img = cap.read()
    img = rescaleFrame(img, scale=1)

    # obrazek nebo videoframe mame nacteny a pripadne zmenseny
    blank = np.zeros(img.shape, dtype='uint8')
    canvas = np.zeros(img.shape, dtype='uint8')  # prazdne platna stejne velikosti jak img

    imgorigGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    # pripravim si posuvniky pro body
    lhx = cv.getTrackbarPos("LHx", "TrackBars")
    lhy = cv.getTrackbarPos("LHy", "TrackBars")
    phx = cv.getTrackbarPos("PHx", "TrackBars")
    phy = cv.getTrackbarPos("PHy", "TrackBars")
    ldx = cv.getTrackbarPos("LDx", "TrackBars")
    ldy = cv.getTrackbarPos("LDy", "TrackBars")
    pdx = cv.getTrackbarPos("PDx", "TrackBars")
    pdy = cv.getTrackbarPos("PDy", "TrackBars")

    #OK nakreslim to carami do puvodniho obrazku
    cv.line(img, (lhx,lhy),(phx,phy),color)
    cv.line(img, (lhx,lhy),(ldx,ldy),color)
    cv.line(img, (pdx,pdy),(phx,phy),color)
    cv.line(img, (pdx,pdy),(ldx,ldy),color)

    # mam 4 body
    region_of_interest_vertices = [
        (lhx, lhy),
        (ldx, ldy),
        (phx, phy),
        (pdx, pdy)
    ]
    # seradim je at to dava spojity ctyruhelnik a ne motylka
    reordered_roi = reorder(np.array([region_of_interest_vertices],np.int32))

    # upravim perspektivu
    cropped_image = getWarp(imgorigGray, reordered_roi)
    # cropped_image = region_of_interest(img, np.array([region_of_interest_vertices], np.int32),)

    imgStack3 = stackImages(1, ([img, imgorigGray]))
    cv.imshow("WARP", cropped_image)
    cv.imshow("Stacked Images", imgStack3)
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv.destroyAllWindows
pomocne.py:

Kód: Vybrat vše

import cv2 as cv
import numpy as np

def rescaleFrame(frame, scale=0.75):
    # Images, Videos and Live Video
    width = int(frame.shape[1] * scale)
    height = int(frame.shape[0] * scale)

    dimensions = (width,height)

    return cv.resize(frame, dimensions, interpolation=cv.INTER_AREA)

def stackImages(scale, imgArray):
    rows = len(imgArray)
    cols = len(imgArray[0])
    rowsAvailable = isinstance(imgArray[0], list)
    width = imgArray[0][0].shape[1]
    height = imgArray[0][0].shape[0]
    if rowsAvailable:
        for x in range(0, rows):
            for y in range(0, cols):
                if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:
                    imgArray[x][y] = cv.resize(imgArray[x][y], (0, 0), None, scale, scale)
                else:
                    imgArray[x][y] = cv.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]),
                                                None, scale, scale)
                if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv.cvtColor(imgArray[x][y], cv.COLOR_GRAY2BGR)
        imageBlank = np.zeros((height, width, 3), np.uint8)
        hor = [imageBlank] * rows
        hor_con = [imageBlank] * rows
        for x in range(0, rows):
            hor[x] = np.hstack(imgArray[x])
        ver = np.vstack(hor)
    else:
        for x in range(0, rows):
            if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                imgArray[x] = cv.resize(imgArray[x], (0, 0), None, scale, scale)
            else:
                imgArray[x] = cv.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None, scale, scale)
            if len(imgArray[x].shape) == 2: imgArray[x] = cv.cvtColor(imgArray[x], cv.COLOR_GRAY2BGR)
        hor = np.hstack(imgArray)
        ver = hor
    return ver


def reorder(myPoints):
    # print("myPoints:", myPoints)
    myPoints = myPoints.reshape(4, 2)
    # print("myPointsResh:", myPoints)
    myPointsNew = np.zeros((4, 1, 2), np.int32)
    add = myPoints.sum(1)
    # print("add", add)
    myPointsNew[0] = myPoints[np.argmin(add)]
    myPointsNew[3] = myPoints[np.argmax(add)]
    diff = np.diff(myPoints, axis=1)
    myPointsNew[1] = myPoints[np.argmin(diff)]
    myPointsNew[2] = myPoints[np.argmax(diff)]
    # print("NewPoints",myPointsNew)
    return myPointsNew

def empty(a):
    pass
Jako další musím řešit nějaké zpracování číselníku - rozsekat na číslice a pak je přečíst buď
- přes nějaké OCR (Tesseract je i pro Raspberry) - což je možná kanon na vrabce, potřebuji jen deset hodnot
- nebo si vytrénovat nějakou neuronovou síť - to by mohlo být to pravé pokud získám dost obrázků a použitelné pro více měřáků, set na vodoměry je volně dostupný, plynoměry jsem zatím nenašel.
- nebo detekovat co je to za číslici nějak výpočtem - kolik má konců, kolik oblouků - nejsem si jistý nakolik to půjde zaostřit.
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Počítačové vidění

Příspěvek od kiklhorn »

Tak jsem trochu pokročil.

Zkouším OCR přes Tesseract

Musím se toho ještě spoustu načit o filtrech, ale pokud se mi podaří obrázek vyčistit a zbavit se nedotočených číslic na číselníku tak by mohl být úspěch.

Zatím dostávám

874010, nebo 674010, jen velmi občas trefí tu trojku co jí chybí spodek a naopak přebývá vršek.
Přílohy
tesseracttest.jpg
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Počítačové vidění

Příspěvek od kiklhorn »

Už je to podstatně lepší. Zkusím ještě kameru mechanicky doostřit.
Zatím vše strkám do Tesseractu vcelku, ale už umím automaticky vytáhnout jednotlivé číslice (plochu číselníku zatím specifikuji stále ručně) - takže už by byl i případný zdroj obrázků pro tréning neuronové sítě.

Byl by tu do budoucna někdo kdo má esp32-cam(případně jinou) a stejný plynoměrový číselník a chtěl by mi pomoci?
Přílohy
dostavam cisla.jpg
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Počítačové vidění

Příspěvek od kiklhorn »

Tak to vypadá že zbytečně vymýšlím kolo: https://github.com/jomjol/AI-on-the-edge-device/wiki
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Uživatelský avatar
Pete30
Moderátor
Moderátor
Příspěvky: 3332
Registrován: 30. září 2020, 20:33
Dal poděkování: 172 poděkování
Dostal poděkování: 364 poděkování

Re: Počítačové vidění

Příspěvek od Pete30 »

To si nemyslím, protože jestli zde bude komplexní návod i tak trochu pro začátečníky bude to mít svůj účel a určitě to někdo vyzkouší.
Pokud nejsem přítomen tak jsem na rybách ;)

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Počítačové vidění

Příspěvek od kiklhorn »

Pokračuji, alespoň se něco naučím.

Poprosím o pomoc -

nahrajte mi nějaké fotky vašich plynoměrů - potřebuji jich ideálně pár stovek, z různých úhlů a vzdáleností a fotky číselníků zblízka, klidně z úhlu ve kterém byste měli umístěnou kameru pro snímání.

chci je použít pro naučení neuronové sítě jak pro rozpoznání číselníku tak číslic

Nahrávat prosím sem:
https://drive.google.com/drive/folders/ ... sp=sharing

Je tam přístup pro všechny s odkazem, pokud nemáte vlastní účet google tak se v případě nouze přihlaste přes údaje
plyn zavinac vuuv tecka cz
a bez mezer p l y n p l y n

Díky
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Uživatelský avatar
Pete30
Moderátor
Moderátor
Příspěvky: 3332
Registrován: 30. září 2020, 20:33
Dal poděkování: 172 poděkování
Dostal poděkování: 364 poděkování

Re: Počítačové vidění

Příspěvek od Pete30 »

Tady je možná něco co ti poskytne pár informací:
https://github.com/nohn/watermeter

Ty fotky co požaduješ stačí třeba z mobilu ?
Pokud nejsem přítomen tak jsem na rybách ;)

Uživatelský avatar
Lion®
Administrátor fóra
Administrátor fóra
Příspěvky: 1604
Registrován: 28. září 2020, 14:07
Bydliště: podkrkonoší
Dal poděkování: 144 poděkování
Dostal poděkování: 193 poděkování
Kontaktovat uživatele:

Re: Počítačové vidění

Příspěvek od Lion® »

________________
🍻 Přispěj a získej přístup do obsahu fóra pro dárce. :thx:
Oficiální sada s Raspberry Pi 4B/4GB, černá +Argon NEO Raspberry Pi 4 Case
Patriot Burst 2.5" SATA SSD 120GB + AXAGON EE25-XA6 ALINE box

Galerie realizací

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Počítačové vidění

Příspěvek od kiklhorn »

Stačí z mobilu. Díky.
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Odpovědět

Zpět na „Komplexní projekty“