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
, която тук е червена и ще се използва за очертаване на откритите кръгове. Останалата част от кода е както следва.
- Променяме нашето оригинално изображение, което е
srcMat
в сива скала и го запазваме вgrayMat
, така че и трите канала (RGB) да могат да бъдат еднакви. Това помага за точни резултати. - След това вземаме
grayMat
и прилагаме филтър за размазване, известен като Замъгляване по Гаус към изображението в сиви скали и го запазваме вblurredMat
, за да намалим шума. По принцип това ще изглади изображението и ще направи ненужните ръбове разтворени. - Накрая сме готови да използваме метода
cv.HoughCircles(srcMat, circlesMat, dp, minDist, param1, param2, minRadius, maxRadius)
, който ще открие кръговете и ще ги запази вcirclesMat
. Въпреки че по-голямата част от времето подадените по-горе параметри трябва да работят добре, но можете да проверите официалните документи за разширена конфигурация. - След това итерираме и получаваме координатите x и y на центъра на открития кръг заедно с неговия радиус. Създаваме променлива
center
, която еPoint
с координати x и y и използваме методаcv.circle(dstMat, center, radius, color, thickness)
, който чертае кръг, очертаващ всеки открит кръг. Обърнете внимание, че използвахмеsrcMat
като нашdstMat
, тъй като искаме контурите да бъдат начертани върху оригиналното изображение.
Накрая записваме нашите srcMat
на платното и изтриваме всички Mat
, за да освободим паметта.
След като изпълните кода по-горе, ще получите изображение като по-долу, написано върху вашето платно.
Добре, това беше въведение в компютърното зрение в OpenCV.js и имаше за цел да ви запознае с основната идея как се прави.
Още за OpenCV.js
- Как да използвам OpenCV.js с TypeScript
- „Научете основите на OpenCV.js“
Благодарим ви, че прочетохте.
Повече съдържание в PlainEnglish.io.
Регистрирайте се за нашия безплатен седмичен бюлетин. Следвайте ни в Twitter, LinkedIn, YouTube и Discord .