OpenCV може да бъде един от най-подходящите решения за много проблеми с компютърното зрение. Въпреки че областта на компютърното зрение напредва и библиотеките за машинно обучение стават по-добър избор за компютърно зрение, OpenCV все още няма да отиде никъде за дълго време.

OpenCV предлага решения за различни области на проблеми в индустрията за компютърно зрение и все още е обичан и предпочитан от много разработчици.

Компютърно зрение

Компютърното зрение е областта на изкуствения интелект, която позволява на компютрите да извличат смислена и описателна информация от изображения. Задачи, известни като извличане на характеристики, откриване на обекти, сегментиране на изображения, разпознаване на лица и т.н., са част от компютърното зрение.

В тази област компютрите се научават да анализират и интерпретират визуалния свят, което кара индустрии като наблюдение, здравеопазване, автомобили и развлечения да се подобряват всеки ден.

С OpenCV.js

OpenCV.js може да се използва за откриване на лица, откриване на ръбове, откриване на контури, съвпадение на шаблони, сегментиране на изображения и др. И тъй като компютърното зрение е широко понятие, не всичко може да бъде обхванато в един урок.

Ще разгледаме как OpenCV.js може да се използва за изпълнение на основна задача за компютърно зрение. Ще открием кръгове в изображението, защото това е най-лесният начин да започнете с компютърно зрение в OpenCV и е идеален за този урок.

Този урок предполага, че сте запознати с Основи на OpenCV.js и знаете как да включите OpenCV.js във вашето приложение. Научете „тук“, ако не го правите.

Можете да изтеглите изображението по-долу и да го следвате.

Използвайте кода по-долу, за да откриете кръгли обекти в горното изображение.

// Get the image.
const image = document.getElementById('image-id')
// Get the canvas.
const canvas = document.getElementById('canvas-id')


// Read the image and create a `Mat` object.
const srcMat = cv.imread(image);

// Create a `Mat` for saving detected circles.
const circlesMat = new cv.Mat();
// Create a `Scalar` representing red color.
const color = new cv.Scalar(255, 0, 0, 255);

// 1) First of all we will convert image into grayscale.
const grayMat = new cv.Mat();
cv.cvtColor(srcMat, grayMat, cv.COLOR_RGBA2GRAY, 0);

// 2) We will apply Gaussian Blur for noise reduction.
const blurredMat = new cv.Mat();
cv.GaussianBlur(grayMat, blurredMat, new cv.Size(5, 5), 0);

// 3) Then we will detect the circles and save it in `circlesMat`.
cv.HoughCircles(blurredMat, circlesMat, cv.HOUGH_GRADIENT, 1, 45, 75, 40, 0, 0);

// 4) Iterate over the detected circles and get the
// x and y coordinate and the radius.
for (let i = 0; i < circlesMat.cols; i++) {
  // Get the x coordinate of the center of the detected circle.
  const x = circlesMat.data32F[i * 3];
  // Get the y coordinate of the center of the detected circle.
  const y = circlesMat.data32F[i * 3 + 1];
  // Get the radius.
  const radius = circlesMat.data32F[i * 3 + 2];
  // Create a `Point` object with x and y coordinate.
  const center = new cv.Point(x, y);

  // Draw each detected circle in the `srcMat`.
  cv.circle(srcMat, center, radius, color, 2);
}

// Write the `srcMat` to the canvas.
cv.imshow(canvas, srcMat);

// Release the resources to avoid memory issues.
srcMat.delete();
grayMat.delete();
circlesMat.delete();
blurredMat.delete();

Обяснение на кода:

Първо, получаваме нашите image и canvas, върху които ще напишем крайния резултат, след което четем, че image създава srcMat. Също така създаваме circlesMat, за да запазим откритите кръгове заедно с променлива color, която тук е червена и ще се използва за очертаване на откритите кръгове. Останалата част от кода е както следва.

  1. Променяме нашето оригинално изображение, което е srcMatв сива скала и го запазваме в grayMat, така че и трите канала (RGB) да могат да бъдат еднакви. Това помага за точни резултати.
  2. След това вземаме grayMat и прилагаме филтър за размазване, известен като Замъгляване по Гаус към изображението в сиви скали и го запазваме в blurredMat, за да намалим шума. По принцип това ще изглади изображението и ще направи ненужните ръбове разтворени.
  3. Накрая сме готови да използваме метода cv.HoughCircles(srcMat, circlesMat, dp, minDist, param1, param2, minRadius, maxRadius), който ще открие кръговете и ще ги запази в circlesMat. Въпреки че по-голямата част от времето подадените по-горе параметри трябва да работят добре, но можете да проверите официалните документи за разширена конфигурация.
  4. След това итерираме и получаваме координатите x и y на центъра на открития кръг заедно с неговия радиус. Създаваме променлива center, която е Point с координати x и y и използваме метода cv.circle(dstMat, center, radius, color, thickness), който чертае кръг, очертаващ всеки открит кръг. Обърнете внимание, че използвахме srcMat като наш dstMat, тъй като искаме контурите да бъдат начертани върху оригиналното изображение.

Накрая записваме нашите srcMat на платното и изтриваме всички Mat, за да освободим паметта.

След като изпълните кода по-горе, ще получите изображение като по-долу, написано върху вашето платно.

Добре, това беше въведение в компютърното зрение в OpenCV.js и имаше за цел да ви запознае с основната идея как се прави.

Още за OpenCV.js

Благодарим ви, че прочетохте.

Повече съдържание в PlainEnglish.io.

Регистрирайте се за нашия безплатен седмичен бюлетин. Следвайте ни в Twitter, LinkedIn, YouTube и Discord .