ื‘ื•ื™ืขืŸ ืึท ืคึผื ื™ื ื“ืขืจืงืขื ื•ื ื’ ืกื™ืกื˜ืขื ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ Golang ืื•ืŸ OpenCV

ื‘ื•ื™ืขืŸ ืึท ืคึผื ื™ื ื“ืขืจืงืขื ื•ื ื’ ืกื™ืกื˜ืขื ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ Golang ืื•ืŸ OpenCV
OpenCV ืื™ื– ืึท ื‘ื™ื‘ืœื™ืึธื˜ืขืง ื“ื™ื–ื™ื™ื ื“ ืคึฟืึทืจ ืงืึธืžืคึผื™ื•ื˜ืขืจ ื–ืขืื•ื ื’ ืคึผืจืึทื“ื–ืฉืขืงืก. ื–ื™ ืื™ื– ืฉื•ื™ืŸ ืืœื˜ ื‘ืขืจืš 20 ื™ืืจ. ืื™ืš ื’ืขื•ื•ื™ื™ื ื˜ ืขืก ืื™ืŸ ืงืึธืœืขื’ืข ืื•ืŸ ื ืึธืš ื ื•ืฆืŸ ืขืก ืคึฟืึทืจ ืžื™ื™ืŸ C ++ ืื•ืŸ ืคึผื™ื˜ื”ืึธืŸ ืคึผืจืึทื“ื–ืฉืขืงืก ื•ื•ื™ื™ึทืœ ืขืก ื”ืื˜ ื’ื•ื˜ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ื“ื™ ืฉืคึผืจืึทื›ืŸ.

ืึธื‘ืขืจ ื•ื•ืขืŸ ืื™ืš ืกื˜ืึทืจื˜ืขื“ ืœืขืจื ืขืŸ ืื•ืŸ ื ื•ืฆืŸ Go, ืื™ืš ื’ืขื•ื•ืืจืŸ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ืฆื™ OpenCV ืงืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ืขื ืฉืคึผืจืึทืš. ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜, ืขืก ื–ืขื ืขืŸ ืฉื•ื™ืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืื•ืŸ ื˜ื•ื˜ืึธืจื™ืึทืœื– ืื•ื™ืฃ ื™ื ื˜ืึทื’ืจื™ื™ืฉืึทืŸ, ืึธื‘ืขืจ ืขืก ื’ืขื•ื•ืขืŸ ืฆื• ืžื™ืจ ืึทื– ื–ื™ื™ ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ืฆื• ืงืึธืžืคึผืœื™ืฆื™ืจื˜. ื ื‘ื™ืกืœ ืฉืคึผืขื˜ืขืจ, ืื™ืš ื’ืขืคึฟื•ื ืขืŸ ืึท ืจืึทืคึผืขืจ ื‘ืืฉืืคืŸ ื“ื•ืจืš ื“ื™ ื”ื™ื‘ืจื™ื“ ื’ืจื•ืคืข ืžืึทื ืฉืึทืคึฟื˜. ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืื™ืš ื•ื•ืขื˜ ื•ื•ื™ื™ึทื–ืŸ ืื™ืจ ื•ื•ื™ ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ GoCV ื“ื•ืจืš ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ืึท ืคึผืฉื•ื˜ ืคึผื ื™ื ื“ืขืจืงืขื ื•ื ื’ ืกื™ืกื˜ืขื ืžื™ื˜ Haar Cascades.

Skillbox ืจืขืงืึทืžืขื ื“ื–: ืคึผืจืึทืงื˜ื™ืฉ ืงื•ืจืก "Python ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืคึฟื•ืŸ ืงืจืึทืฆืŸ".

ืžื™ืจ ื“ืขืจืžืึธื ืขืŸ ืื™ืจ: ืคึฟืึทืจ ืึทืœืข ืœื™ื™ืขื ืขืจ ืคื•ืŸ "ื”ื‘ืจ" - ืึท ืึทืจืึธืคึผืจืขื›ืขื ืขืŸ ืคื•ืŸ 10 ืจื•ื‘ืœ ื•ื•ืขืŸ ืื™ืจ ืคืึทืจืฉืจื™ื™ึทื‘ืŸ ืื™ืŸ ืงื™ื™ืŸ ืกืงื™ืœื‘ืึธืงืก ืงื•ืจืก ื ื™ืฆืŸ ื“ื™ ืคึผืขืจืžืึธื•ืฉืึทื ืึทืœ ืงืึธื“ "ื”ื‘ืจ".

ื•ื•ืึธืก ืื™ื– ืคืืจืœืื ื’ื˜:

  • ื’ื™ื™ืŸ;
  • OpenCV (ื™ื ืกื˜ืึทืœืœืขืจ ืœื™ื ืงืก ืื•ื ื˜ืŸ);
  • ื•ื•ืขื‘ ืึธื“ืขืจ ืจืขื’ื•ืœืขืจ ื•ื•ื™ื“ืขื ืึทืคึผืึทืจืึทื˜.

ื™ื ืกื˜ืึทืœื™ืจื•ื ื’

ื‘ื™ื™ึทืฉืคึผื™ืœ ืงืกื ื•ืžืงืก

ืื™ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืžื™ืจ ื•ื•ืขืœืŸ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืึธืก ืขืคึฟื ื˜ ืึท ืคึฟืขื ืฆื˜ืขืจ ืžื™ื˜ ืึท ืึทืคึผืึทืจืึทื˜ ื•ื•ื™ื“ืขื ื˜ื™ื™ึทืš.

ืขืจืฉื˜ืขืจ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืึทืจื™ื™ึทื ืคื™ืจ ื“ื™ ืœื™ื™ื‘ืจืขืจื™ื– ื“ืืจืฃ ืคึฟืึทืจ ืึทืจื‘ืขื˜.

ืึทืจื™ื™ึทื ืคื™ืจ (
"ืงืœืึธืฅ"
"gocv.io/x/gocv"
)

ื ืึธืš ื“ืขื, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท VideoCapture ื›ื™ื™ืคืขืฅ ื ื™ืฆืŸ ื“ื™ VideoCaptureDevice ืคื•ื ืงืฆื™ืข. ื“ื™ ื™ืขื ืขืจ ืžืื›ื˜ ืขืก ืžืขื’ืœืขืš ืฆื• ื›ืึทืคึผืŸ ืึท ื•ื•ื™ื“ืขื ื˜ื™ื™ึทืš ืžื™ื˜ ืึท ืึทืคึผืึทืจืึทื˜. ื“ื™ ืคึฟื•ื ืงืฆื™ืข ื ื™ืฆื˜ ืึท ื’ืึทื ืฅ ื ื•ืžืขืจ ื•ื•ื™ ืึท ืคึผืึทืจืึทืžืขื˜ืขืจ (ืขืก ืจืขืคึผืจืึทื–ืขื ืฅ ื“ื™ ืžื™ื˜ืœ ืฉื™ื™ึทืŸ).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(โ€œerror opening web cam: %vโ€, err)
}
defer webcam.Close()

ืื™ืฆื˜ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท n-ื“ื™ืžืขื ืฉืึทื ืึทืœ ืžืึทื˜ืจื™ืฅ. ืขืก ื•ื•ืขื˜ ืงืจืึธื ื‘ื™ืœื“ืขืจ ืœื™ื™ืขื ืขืŸ ืคึฟื•ืŸ ื“ืขืจ ืึทืคึผืึทืจืึทื˜.

img := gocv.NewMat()
defer img.Close()

ืฆื• ื•ื•ื™ื™ึทื–ืŸ ืึท ื•ื•ื™ื“ืขื ื˜ื™ื™ึทืš, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ืคึฟืขื ืฆื˜ืขืจ - ื“ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ืžื™ื˜ ื“ื™ NewWindow ืคื•ื ืงืฆื™ืข.

window := gocv.NewWindow(โ€œwebcamwindowโ€)
defer window.Close()

ืื™ืฆื˜ ืœืึธืžื™ืจ ื’ื™ื™ืŸ ืฆื• ื“ื™ ืžืขืจืกื˜ ื˜ืฉื™ืงืึทื•ื•ืข ื˜ื™ื™ืœ.

ื–ื™ื ื˜ ื•ื•ื™ื“ืขื ืื™ื– ืึท ืงืขืกื™ื™ื“ืขืจื“ื™ืง ื˜ื™ื™ึทืš ืคื•ืŸ ื‘ื™ืœื“ ืจืึธืžืขืŸ, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ื™ื ืคืึทื ืึทื˜ ืฉืœื™ื™ืฃ ืฆื• ืขื ื“ืœืึทืกืœื™ ืœื™ื™ืขื ืขืŸ ื“ื™ ื•ื•ื™ื“ืขื ื˜ื™ื™ึทืš ืคื•ืŸ ื“ื™ ืึทืคึผืึทืจืึทื˜. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืื™ืจ ื“ืึทืจืคึฟืŸ ื“ื™ ืœื™ื™ืขื ืขืŸ ืื•ืคึฟืŸ ืคื•ืŸ ื“ืขื ื˜ื™ืคึผ VideoCapture. ืขืก ื•ื•ืขื˜ ื“ืขืจื•ื•ืึทืจื˜ืŸ ืึท ืžืึทื˜ืข ื˜ื™ืคึผ (ื“ื™ ืžืึทื˜ืจื™ืฅ ืžื™ืจ ื‘ืืฉืืคืŸ ืื•ื™ื‘ืŸ), ื•ื•ืึธืก ื•ื•ืขื˜ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืึท ื‘ื•ืœื™ืึทืŸ ื•ื•ืขืจื˜ ื•ื•ืึธืก ื™ื ื“ื™ืงื™ื™ืฅ ืฆื™ ื“ื™ ืจืึทื ืคื•ืŸ ื“ื™ ื•ื•ื™ื“ืขืึธืงืึทืคึผื˜ื•ืจืข ืื™ื– ืœื™ื™ืขื ืขืŸ ื”ืฆืœื—ื” ืึธื“ืขืจ ื ื™ืฉื˜.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty( {
        log.Println(โ€œUnable to read from the webcamโ€)    continue
     }
.
.
.
}

ืื™ืฆื˜ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื•ื•ื™ื™ึทื–ืŸ ื“ื™ ืจืึทื ืื™ืŸ ื“ื™ ื‘ืืฉืืคืŸ ืคึฟืขื ืฆื˜ืขืจ. ื“ื™ ืคึผื•ื™ื–ืข ืคึฟืึทืจ ืžืึธื•ื•ื™ื ื’ ืฆื• ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืจืึทื ืื™ื– 50 ืžื™ื–.

window.IMShow (img)
ื•ื•ื™ื ื“ืึธื•.ื•ื•ื™ื™ื˜ืงื™ื™ (50)

ื ืึธืš ืœืึธื ื˜ืฉื™ื ื’ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืึท ืคึฟืขื ืฆื˜ืขืจ ืžื™ื˜ ืึท ื•ื•ื™ื“ืขื ื˜ื™ื™ึทืš ืคึฟื•ืŸ ื“ืขืจ ืึทืคึผืึทืจืึทื˜ ื•ื•ืขื˜ ืขืคืขื ืขืŸ.

ื‘ื•ื™ืขืŸ ืึท ืคึผื ื™ื ื“ืขืจืงืขื ื•ื ื’ ืกื™ืกื˜ืขื ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ Golang ืื•ืŸ OpenCV

package main
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("error opening device: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the webcam")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

ื‘ื™ื™ึทืฉืคึผื™ืœ ืงืกื ื•ืžืงืก

ืื™ืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ, ืœืึธื–ืŸ ืื•ื ื“ื– ื ื•ืฆืŸ ื“ืขื ืคืจื™ืขืจื“ื™ืงืŸ ื‘ื™ื™ึทืฉืคึผื™ืœ ืื•ืŸ ื‘ื•ื™ืขืŸ ืึท ืคึผื ื™ื ื“ืขืจืงืขื ื•ื ื’ ืกื™ืกื˜ืขื ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ Haar Cascades.

ื”ืึทืึทืจ ืงืึทืกืงืึทื“ืขืก ื–ืขื ืขืŸ ืงืึทืกืงื™ื™ื“ ืงืœืึทืกืกื™ืคื™ืขืจืก ื•ื•ืึธืก ื–ืขื ืขืŸ ื˜ืจื™ื™ื ื“ ืžื™ื˜ ื“ื™ ื”ืึทืึทืจ ื•ื•ืึทื•ื•ืขืœืขื˜ ื˜ืขื›ื ื™ืง. ื–ื™ื™ ืึทื ืึทืœื™ื™ื– ื“ื™ ื‘ื™ืœื“ืฆืขืœืŸ ืื™ืŸ ืึท ื‘ื™ืœื“ ืฆื• ื“ืขื˜ืขืงื˜ ื–ื™ื›ืขืจ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ. ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืžืขืจ ื•ื•ืขื’ืŸ Haar Cascades, ื ืึธื›ื’ื™ื™ืŸ ื“ื™ ืœื™ื ืงืก ืื•ื ื˜ืŸ.

Viola-Jones ื›ื™ื™ืคืขืฅ ื“ื™ื˜ืขืงืฉืึทืŸ ืคืจื™ื™ืžื•ื•ืขืจืง
ืงืึทืกืงืึทื“ื™ื ื’ ืงืœืึทืกืกื™ืคื™ืขืจืก
ื”ืึทื™ืจ-ื•ื•ื™ ืฉื˜ืจื™ืš

ืืจืืคืงืืคื™ืข ืฉื•ื™ืŸ ื˜ืจื™ื™ื ื“ ืงืึทืกืงื™ื™ื“ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื“ืึธ. ืื™ืŸ ื“ืขื ืงืจืึทื ื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืงืึทืกืงื™ื™ื“ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื ื™ืฆื˜ ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืึท ืžืขื ื˜ืฉ 'ืก ืคึผื ื™ื ืคื•ืŸ ื“ื™ ืคืจืึธื ื˜.

ืื™ืŸ ืกื“ืจ ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืึทืคึฟืŸ ืึท ืงืœืึทืกืกื™ืคื™ืขืจ ืื•ืŸ ืงืึธืจืžืขืŸ ืขืก ืึท ืฉื•ื™ืŸ ื˜ืจื™ื™ื ื“ ื˜ืขืงืข (ื“ืขืจ ืœื™ื ืง ืื™ื– ื’ืขื’ืขื‘ืŸ ืื•ื™ื‘ืŸ). ืื™ืš ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ื•ืคึผืœืึธืึทื“ืขื“ ื“ื™ pencv_haarcascade_frontalface_default.xml ื˜ืขืงืข ืฆื• ื“ื™ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ื•ื•ื• ืื•ื ื“ื–ืขืจ ืคึผืจืึธื’ืจืึทื ืื™ื– ืœื™ื’ืŸ.

harrcascade := โ€œopencv_haarcascade_frontalface_default.xmlโ€classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

ืฆื• ื“ืขื˜ืขืงื˜ ืคื ื™ืžืขืจ ืื™ืŸ ืึท ื‘ื™ืœื“, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื ื•ืฆืŸ ื“ืขื ืื•ืคึฟืŸ ื“ืขื˜ืขืงื˜ ืžื•ืœื˜ื™ืกืงืึทืœืข. ื“ื™ ืคึฟื•ื ืงืฆื™ืข ื ืขืžื˜ ืึท ืจืึทื (ื˜ื™ืคึผ ืžืึทื˜ืข) ื•ื•ืึธืก ืื™ื– ืคึผื•ื ืงื˜ ืœื™ื™ืขื ืขืŸ ืคึฟื•ืŸ ื“ื™ ื•ื•ื™ื“ืขื ื˜ื™ื™ึทืš ืคื•ืŸ ื“ื™ ืึทืคึผืึทืจืึทื˜ ืื•ืŸ ืงืขืจื˜ ืึท ืžืขื ื’ืข ืคื•ืŸ โ€‹โ€‹ื˜ื™ืคึผ ืจืขืงื˜ืึทื ื’ืœืข. ื“ื™ ืžืขื ื’ืข ื’ืจื™ื™ืก ืจืขืคึผืจืึทื–ืขื ืฅ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืคื ื™ืžืขืจ ืึทื– ื“ื™ ืงืœืึทืกืกื™ืคื™ืขืจ ืื™ื– ื‘ื™ื›ื•ืœืช ืฆื• ื“ืขื˜ืขืงื˜ ืื™ืŸ ื“ื™ ืจืึทื. ื“ืขืจื ืึธืš, ืฆื• ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืžื™ืจ ื–ืขืŸ ื•ื•ืึธืก ืขืก ื’ืขืคึฟื•ื ืขืŸ, ืœืึธื–ืŸ ืื•ื ื“ื– ื™ื˜ืขืจื™ื™ื˜ ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ืจืขืงื˜ืึทื ื’ื’ืึทืœื– ืื•ืŸ ื“ืจื•ืงืŸ ื“ื™ ืจืขืงื˜ืึทื ื’ืœืข ื›ื™ื™ืคืขืฅ ืฆื• ื“ื™ ืงืึทื ืกืึธื•ืœ, ืฉืึทืคึฟืŸ ืึท ื’ืจืขื ืขืฅ ืึทืจื•ื ื“ื™ ื“ื™ื˜ืขืงื˜ืึทื“ ื’ืจืึธื“ืขืง. ื“ืขื ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ืžื™ื˜ ื“ื™ ืจืขืงื˜ืึทื ื’ืœืข ืคึฟื•ื ืงืฆื™ืข. ืขืก ื•ื•ืขื˜ ืึธื ื ืขืžืขืŸ ื“ื™ ืžืึทื˜ืข ืœื™ื™ืขื ืขืŸ ื“ื•ืจืš ื“ื™ ืึทืคึผืึทืจืึทื˜, ื“ื™ ืจืขืงื˜ืึทื ื’ืœืข ื›ื™ื™ืคืขืฅ ื•ื•ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ืื•ืžื’ืขืงืขืจื˜ ื“ื•ืจืš ื“ื™ DetectMultiScale ืื•ืคึฟืŸ, ื“ื™ ืงืึธืœื™ืจ ืื•ืŸ ื’ืจืขื‘ ืคึฟืึทืจ ื“ื™ ื’ืจืขื ืขืฅ.

for _, r := range rects {
fmt.Println(โ€œdetectedโ€, r)
gocv.Rectangle(&img, r, color, 2)
}

ื‘ื•ื™ืขืŸ ืึท ืคึผื ื™ื ื“ืขืจืงืขื ื•ื ื’ ืกื™ืกื˜ืขื ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ Golang ืื•ืŸ OpenCV

ื‘ื•ื™ืขืŸ ืึท ืคึผื ื™ื ื“ืขืจืงืขื ื•ื ื’ ืกื™ืกื˜ืขื ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ Golang ืื•ืŸ OpenCV

package main
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening web cam: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
harrcascade := "opencv_haarcascade_frontalface_default.xml"
classifier := gocv.NewCascadeClassifier()
classifier.Load(harrcascade)
defer classifier.Close()
 
color := color.RGBA{0, 255, 0, 0}
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the device")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

ืื•ืŸ... ื™ืึธ, ืึทืœืฅ ื”ืึธื˜ ืื•ื™ืกื’ืขืึทืจื‘ืขื˜! ืžื™ืจ ืื™ืฆื˜ ื”ืึธื‘ืŸ ืึท ืคึผืฉื•ื˜ ืคืึทืกื™ืึทืœ ื“ืขืจืงืขื ื•ื ื’ ืกื™ืกื˜ืขื ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ Go. ื‘ืืœื“ ืื™ืš ืคึผืœืึทืŸ ืฆื• ืคืึธืจื–ืขืฆืŸ ื“ื™ ื™ืงืกืคึผืขืจืึทืžืึทื ืฅ ืื•ืŸ ืฉืึทืคึฟืŸ ื ื™ื™ึทืข ืงื™ืœ ื˜ื™ื ื’ื– ื“ื•ืจืš ืงืึทืžื‘ื™ื™ื ื™ื ื’ Go ืื•ืŸ OpenCV.

ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜, ื‘ื™ื˜ืข ืึธืคึผืฉืึทืฆืŸ gRPC ื•ื•ืขื‘ ืกืขืจื•ื•ืขืจ, ื•ื•ืึธืก ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ Python ืื•ืŸ OpenCV. ืขืก ืกื˜ืจื™ืžื– ื“ืึทื˜ืŸ ื“ืขืจ ืžืึธืžืขื ื˜ ืึท ืคึผื ื™ื ืื™ื– ื“ื™ื˜ืขืงื˜ืึทื“. ื“ืึธืก ืื™ื– ื“ืขืจ ื™ืกื•ื“ ืคึฟืึทืจ ืงืจื™ื™ื™ื˜ื™ื ื’ ืคืึทืจืฉื™ื“ืขื ืข ืงืœื™ื™ืึทื ืฅ ืื™ืŸ ืคืึทืจืฉื™ื“ืขื ืข ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทื›ืŸ. ื–ื™ื™ ื•ื•ืขืœืŸ ืงืขื ืขืŸ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ืฆื• ื“ื™ ืกืขืจื•ื•ืขืจ ืื•ืŸ ืœื™ื™ืขื ืขืŸ ื“ืึทื˜ืŸ ืคึฟื•ืŸ ืื™ื.

ื“ืื ืง ืื™ืจ ืคึฟืึทืจ ืœื™ื™ืขื ืขืŸ ื“ืขื ืึทืจื˜ื™ืงืœ!

Skillbox ืจืขืงืึทืžืขื ื“ื–:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’