C++ opencv循环裁剪

C++ opencv循环裁剪,c++,opencv4,C++,Opencv4,我有一个关于人眼睫毛检测的问题。 在实践中,我必须从虹膜上切下被睫毛覆盖的部分,这是我已经得到的。我想对图像进行二值化,因此用一片乌云代替睫毛,从而在整个虹膜上获得正确的切割 auto kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2, 2)); auto ker_ero = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));

我有一个关于人眼睫毛检测的问题。 在实践中,我必须从虹膜上切下被睫毛覆盖的部分,这是我已经得到的。我想对图像进行二值化,因此用一片乌云代替睫毛,从而在整个虹膜上获得正确的切割

auto kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2, 2));
        auto ker_ero = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));

        cv::Mat img_gray = img;
        cv::Mat sum_black_hats(img_gray.rows, img_gray.cols, CV_16U, cv::Scalar(0));
        //cv::Mat se(25, 25, CV_8U, cv::Scalar(1));
        cv::Mat tophat;
    
        //cv::morphologyEx(img_gray, tophat, cv::MORPH_TOPHAT, se);
        cv::morphologyEx(img_gray, tophat, cv::MORPH_TOPHAT, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5)));


        sum_black_hats += tophat;

        // normalization
        cv::normalize(sum_black_hats, sum_black_hats, 0, 255, cv::NORM_MINMAX);

        sum_black_hats.convertTo(sum_black_hats, CV_8U);
    //  aia::imshow("Sum of black hats", sum_black_hats);

        // Otsu binarization
        cv::threshold(sum_black_hats, sum_black_hats, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
        //aia::imshow("Sum of black hats (binarized)", sum_black_hats);

        // prepare mask for next step (inpaint)
        cv::dilate(sum_black_hats, sum_black_hats, kernel);
        //aia::imshow("Inpaint mask", sum_black_hats);

        // inpainting
        cv::inpaint(img, sum_black_hats, img, 7, cv::INPAINT_TELEA);
        //aia::imshow("Final result TOP", img);


        cv::erode(img, bin, ker_ero, cv::Point(2, 2), 2);
        //aia::imshow("Final result erode", img);

        cv::threshold(bin, bin, 30, 255, cv::THRESH_BINARY);//| cv::THRESH_OTSU);
        aia::imshow("bin img", bin);

        cv::morphologyEx(bin, bin, cv::MORPH_CLOSE,
            cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(17, 17)));
        cv::morphologyEx(bin, bin, cv::MORPH_OPEN,
            cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(9, 9)));
        aia::imshow("AFTER CLOSING", bin);

这就像剪瞳孔一样:

void Contours(int, void*) {
        std::vector<std::vector<cv::Point> > contours;
        
        cv::findContours(imgEdges, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);

        drawing = cv::Mat::zeros(imgEdges.size(), CV_8U);
        //cv::cvtColor(drawing, drawing, CV_8U);        //converto l'immagine a colori per vedere meglio i contorni
        for (size_t i = 0; i < contours.size(); i++)
        {

            float A = cv::contourArea(contours[i]);
            if (A >= minArea) {
                //std::cout << "trovato"<<"\n";     //debug
                double p = cv::arcLength(contours[i], true);
                double circularity = (4 * ucas::PI*A) / (p*p);
                //std::cout << circularity <<"\n";      //debug

                if (circularity >= minCircularity) {

                    cv::Scalar color = cv::Scalar(50, 205, 50);
                    pupil = contours[i];
                    cv::drawContours(drawing, contours, i, color, 1, cv::LINE_AA);
                }
            }
        }
        //cv::resize(drawing, drawing, cv::Size(0, 0), 2, 2, cv::INTER_CUBIC);
        cv::imshow("contours", drawing);
    }
        
void等高线(int,void*){
矢量轮廓;
cv::findContours(轮廓、轮廓、cv::RETR_EXTERNAL、cv::CHAIN_About_NONE);
绘图=cv::Mat::零(imgEdges.size(),cv_8U);
//cv::cvtColor(画图,画图,cv_8U);//根据《梅格里奥一世康托尼》制作色彩转换
对于(size_t i=0;i=minArea){
//标准::cout