谢谢尤努斯,你的方法,这就是我所做的,我不知道它是否比你的方法更好。 (对不起,我没有评论:()
Output Image
代码:
#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
int Compteur;
int Area;
int Contours;
Mat ImageSource;
Mat HSV;
Mat Image_Blur;
Mat Seuil;
int main() {
string FichierSource = "C:/Users/xxxxx/Desktop/TBT/cas.png";
ImageSource = imread(FichierSource);
cvtColor(ImageSource, HSV, COLOR_BGR2HSV);
inRange(HSV, Scalar(0, 39 , 149), Scalar(179, 255, 255), Seuil);
erode(Seuil, Seuil, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
dilate(Seuil, Seuil, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
dilate(Seuil, Seuil, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
erode(Seuil, Seuil, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
blur(Seuil, Image_Blur, Size(5, 5));
imshow("Image original", ImageSource);
imshow("Image convertie en HSV", HSV);
imshow("Image seuillé", Seuil);
Mat Threshold_Output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
threshold(Image_Blur, Threshold_Output, 100, 255, THRESH_BINARY);
findContours(Threshold_Output, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<RotatedRect> minRect(contours.size());
vector<RotatedRect> minEllipse(contours.size());
for (int i = 0; i < contours.size(); i++)
{
Area = contourArea(contours[i]);
Contours = contours[i].size();
// -------------------------- DEBUG ZONE ----------------------------
cout << "Contours de la zone : " << contourArea(contours[i]) << endl;
cout << "Nombre de contours : " << contours[i].size() << endl;
// ------------------------------------------------------------------
if (Contours >= 90 && Contours <= 100) {
if (Area >= 2000 && Area <= 3200) {
minRect[i] = minAreaRect(Mat(contours[i]));
minEllipse[i] = fitEllipse(Mat(contours[i]));
}
Compteur++;
}
}
for (int i = 0; i < contours.size(); i++)
{
Area = contourArea(contours[i]);
Contours = contours[i].size();
if (Contours >= 90 && Contours <= 100) {
if (Area >= 2000 && Area <= 3200) {
drawContours(ImageSource, contours, i, Scalar(0, 165, 255), 1, 8, vector<Vec4i>(), 0, Point());
ellipse(ImageSource, minEllipse[i], Scalar(0, 165, 255), 2);
Point2f rect_points[4]; minRect[i].points(rect_points);
for (int j = 0; j < 4; j++)
line(ImageSource, rect_points[j], rect_points[(j + 1) % 4], Scalar(0, 165, 255));
}
}
}
imshow("Image Analysée", ImageSource);
cout << "Nombre d'oeufs : " << Compteur;
waitKey(0);
}