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