How to connect ESP32-CAM With OpenCV ?

Lutfi Arazi
3 min readJan 9, 2021

--

Pada kesempatan saya akan membagikan konfigurasi dan program mengenai bagaimana menghubungkan kamera ESP32 dengan menggunakan OpenCV. Nah Opencv itu apasih ? Opencv merupakan sebuah library opensourece yang dikembangkan oleh perusahaan ternama yaitu Intel. Fungsi dari OpenCV itu sendiri adalah digunakan dalam pengolahan citra digital yang fokusnya mengolah gambar maupun video. Sebelum itu rekan-rekan harus mempersiapkan konfigurasi dan program pada ESP 32-CAM terlebih dahulu. Pada projek ini saya menggunakan ESP32-S.

Link Cara Setup ESP32-CAM : https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/

Setelah melakukan konfigurasi diatas kemudian meng-upload program ke board ESP32 dengan menggunakan software arduino IDE. Berikut adalah programnya.

#include <WebServer.h>
#include <WiFi.h>
#include <esp32cam.h>

const char* WIFI_SSID = “SSID”; //masukkan SSID
const char* WIFI_PASS = “bayar”; //Masukkan password

WebServer server(80);

static auto loRes = esp32cam::Resolution::find(320, 240); //ukuran frame
static auto hiRes = esp32cam::Resolution::find(500, 500); //ukuran frame bisa diatur sesuai kebutuhan

void
handleBmp()
{
if (!esp32cam::Camera.changeResolution(loRes)) {
Serial.println(“SET-LO-RES FAIL”);
}

auto frame = esp32cam::capture();
if (frame == nullptr) {
Serial.println(“CAPTURE FAIL”);
server.send(503, “”, “”);
return;
}
Serial.printf(“CAPTURE OK %dx%d %db\n”, frame->getWidth(), frame->getHeight(),
static_cast<int>(frame->size()));

if (!frame->toBmp()) {
Serial.println(“CONVERT FAIL”);
server.send(503, “”, “”);
return;
}
Serial.printf(“CONVERT OK %dx%d %db\n”, frame->getWidth(), frame->getHeight(),
static_cast<int>(frame->size()));

server.setContentLength(frame->size());
server.send(200, “image/bmp”);
WiFiClient client = server.client();
frame->writeTo(client);
}

void
serveJpg()
{
auto frame = esp32cam::capture();
if (frame == nullptr) {
Serial.println(“CAPTURE FAIL”);
server.send(503, “”, “”);
return;
}
Serial.printf(“CAPTURE OK %dx%d %db\n”, frame->getWidth(), frame->getHeight(),
static_cast<int>(frame->size()));

server.setContentLength(frame->size());
server.send(200, “image/jpeg”);
WiFiClient client = server.client();
frame->writeTo(client);
}

void
handleJpgLo()
{
if (!esp32cam::Camera.changeResolution(loRes)) {
Serial.println(“SET-LO-RES FAIL”);
}
serveJpg();
}

void
handleJpgHi()
{
if (!esp32cam::Camera.changeResolution(hiRes)) {
Serial.println(“SET-HI-RES FAIL”);
}
serveJpg();
}

void
handleJpg()
{
server.sendHeader(“Location”, “/cam-hi.jpg”);
server.send(302, “”, “”);
}

void
handleMjpeg()
{
if (!esp32cam::Camera.changeResolution(hiRes)) {
Serial.println(“SET-HI-RES FAIL”);
}

Serial.println(“STREAM BEGIN”);
WiFiClient client = server.client();
auto startTime = millis();
int res = esp32cam::Camera.streamMjpeg(client);
if (res <= 0) {
Serial.printf(“STREAM ERROR %d\n”, res);
return;
}
auto duration = millis() — startTime;
Serial.printf(“STREAM END %dfrm %0.2ffps\n”, res, 1000.0 * res / duration);
}

void
setup()
{
Serial.begin(115200);
Serial.println();

{
using namespace esp32cam;
Config cfg;
cfg.setPins(pins::AiThinker);
cfg.setResolution(hiRes);
cfg.setBufferCount(2);
cfg.setJpeg(80);

bool ok = Camera.begin(cfg);
Serial.println(ok ? “CAMERA OK” : “CAMERA FAIL”);
}

WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}

Serial.print(“http://”);
Serial.println(WiFi.localIP());
Serial.println(“ /cam.bmp”);
Serial.println(“ /cam-lo.jpg”);
Serial.println(“ /cam-hi.jpg”);
Serial.println(“ /cam.mjpeg”);

server.on(“/cam.bmp”, handleBmp);
server.on(“/cam-lo.jpg”, handleJpgLo);
server.on(“/cam-hi.jpg”, handleJpgHi);
server.on(“/cam.jpg”, handleJpg);
server.on(“/cam.mjpeg”, handleMjpeg);

server.begin();
}

void
loop()
{
server.handleClient();
}

Running program kemudain akan mendapatkan Internet Protocol (IP) dimana IP inilah menjadi penguhubung antara komputer dan ESP32 CAM. Kemudian rekan-rekan perlu mempersiapkan library python yang akan digunakan dimana pada projek ini saya menggunkan bahasa pemprograman python. Ada tiga library yang penting untuk menjalankan projek ini yaitu library opencv, library numpy dan library urlib.requesti. Pada projek ini saya menggunakan Anaconda untuk instalasisi libray dan Visual Studio Code untuk menjalankan program. Berikut adalah program yang digunakan pada projek ini.

import cv2

import numpy as np

import urllib.request

#import pafy # pip3 install youtube-dl

url = ‘http://192.168.0.103/cam-hi.jpg'

while True:

imgResponse = urllib.request.urlopen(url)

framenp= np.array(bytearray(imgResponse.read()), dtype=np.uint8)

frame= cv2.imdecode(framenp, -1)

cv2.imshow(‘vuk’,frame)

k = cv2.waitKey(24)&0xFF

if k == 27:

break

captura.release()

cv2.destroyAllWindows()

Gambar 1 Source Code Pada Visual Studio Code
Gambar 2. Hasil Projek

Cukup sekian pembahsan kali ini jika ada yang kesulitan bisa tulis dikolom komentar. Semoga Bermanfaat

--

--

Lutfi Arazi
Lutfi Arazi

No responses yet