繁体   English   中英

无法弄清楚为什么 opencv.js cv.fitEllipse() 触发未捕获的异常 1 个图像而不是另一个

[英]Can't figure out why opencv.js cv.fitEllipse() triggers uncaught exception with 1 image but not another

我有这个 function 可以简单地从硬币图片中裁剪背景并且大部分都有效。

但出于某种原因,“cv.fitEllipse”给了我一个未捕获的异常图像:坏图像

但适用于这张图片: good image

我不知所措。 有任何想法吗? 不起作用的图像尺寸更大,但这是我唯一能弄清楚的。

有任何想法吗?

     Ellipse_img = function(el) {

            let src = cv.imread('imageChangeup');
            let gray = new cv.Mat();

            cv.cvtColor(src, gray, cv.COLOR_BGR2GRAY);

            let dst = new cv.Mat();

            cv.threshold(gray, dst, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)[1];

            // apply morphology open and close
            let morph = new cv.Mat();
            kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, new cv.Size(5,5));
            cv.morphologyEx(dst, morph, cv.MORPH_OPEN, kernel);
            kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, new cv.Size(21,21));
            cv.morphologyEx(morph, morph, cv.MORPH_CLOSE, kernel);

            //find all the contours
            let contours = new cv.MatVector();
            let hierarchy = new cv.Mat();
            cv.findContours(morph, contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE);

            //find largest contour
            let area_max =0;
            let i_max = 0;
            let cnt_max = 0;

            for (let i = 0; i < contours.size(); i++) {
                let cnt = contours.get(i);
                let area = cv.contourArea(cnt, false);
                if(area >= area_max){
                    area_max = area;
                    i_max = i;
                    cnt_max = cnt;
                }
            }

            let rotatedRect = cv.fitEllipse(cnt_max);  //<<<<<<<<<<<<THE PROBLEM???

            let ellipseColor = new cv.Scalar(255, 255, 255, 255);
            let ellipseColor2 = new cv.Scalar(255, 255, 255, 255);

            cv.ellipse1(src, rotatedRect, ellipseColor, 3, cv.LINE_8);

            let mask = new cv.Mat.ones(src.size(), cv.CV_8UC3);
            cv.ellipse1(mask, rotatedRect, ellipseColor2, -1, cv.LINE_8);
            cv.cvtColor(mask, mask, cv.COLOR_BGR2GRAY);
            cv.bitwise_and(src, src, dst, mask);
            
            cv.imshow('imageChangeup', dst);

            src.delete();
            dst.delete();
            gray.delete();
            morph.delete();
            contours.delete();
            hierarchy.delete();

        };

这里是高水平的 cnt_max 好与坏 - 一定不能找到圆圈,但为什么呢?

cnt_max:  data32S: Int32Array(2426)

cnt_max:  data32S: Int32Array(8)

我的知识还不足以知道为什么……但是……这与“好”图片中 object 周围的白色和使用的 THRESH 有关。

如果我根据背景更改阈值,这会起作用

cv.threshold(gray, dst, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)[1]; //for light backgrounds

cv.threshold(gray, dst, 0, 255, cv.THRESH_OTSU)[1]; //for dark backgrounds

所以我改为adaptiveThreshold似乎适用于所有场景

cv.adaptiveThreshold(gray, dst, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY_INV,11,2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM