Séparation du code: ajout de la fonction filter qui choisit les pixels qui respectent les critères RGB.
This commit is contained in:
parent
edffb137b7
commit
25bb7a8ea7
1 changed files with 50 additions and 36 deletions
|
@ -1,51 +1,65 @@
|
||||||
#include "opencv2/opencv.hpp"
|
#include "opencv2/opencv.hpp"
|
||||||
|
|
||||||
using namespace cv;
|
int filter(const cv::Mat& img, cv::Mat output, int seuil) {
|
||||||
using namespace std;
|
bool detect = false;
|
||||||
|
uchar R, G, B;
|
||||||
|
int rows = img.rows;
|
||||||
|
int cols = img.cols;
|
||||||
|
int dim = img.channels();
|
||||||
|
int indexNB;
|
||||||
|
|
||||||
int main(int, char**)
|
for (int index=0,indexNB=0;index<dim*rows*cols;index+=dim,indexNB++) {
|
||||||
{
|
detect=0;
|
||||||
|
B = img.data[index ];
|
||||||
|
G = img.data[index + 1];
|
||||||
|
R = img.data[index + 2];
|
||||||
|
|
||||||
|
if ((R>G) && (R>B))
|
||||||
|
if (((R-B)>=seuil) || ((R-G)>=seuil))
|
||||||
|
detect=1;
|
||||||
|
if (detect==1)
|
||||||
|
output.data[indexNB]=255;
|
||||||
|
else
|
||||||
|
output.data[indexNB]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
int seuil=80;
|
int seuil=80;
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
seuil = atol(argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
char detect;
|
char detect;
|
||||||
VideoCapture cap(0);
|
cv::VideoCapture cap(0);
|
||||||
if(!cap.isOpened())
|
if(!cap.isOpened())
|
||||||
return -1;
|
return -1;
|
||||||
namedWindow("Image",1);
|
cv::namedWindow("Image",1);
|
||||||
namedWindow("Detection",1);
|
cv::namedWindow("Detection",1);
|
||||||
namedWindow("Contours",1);
|
cv::namedWindow("Contours",1);
|
||||||
for(;;) {
|
while(true) {
|
||||||
int X,Y,DIM,index,indexNB;
|
int X,Y,DIM,index;
|
||||||
unsigned int numc;
|
unsigned int numc;
|
||||||
uchar R,G,B;
|
uchar R,G,B;
|
||||||
vector<vector<Point> > contours;
|
std::vector<std::vector<cv::Point> > contours;
|
||||||
vector<Vec4i> hierarchy;
|
std::vector<cv::Vec4i> hierarchy;
|
||||||
Mat frame;
|
cv::Mat frame;
|
||||||
cap >> frame;
|
cap >> frame;
|
||||||
X=frame.rows;
|
X=frame.rows;
|
||||||
Y=frame.cols;
|
Y=frame.cols;
|
||||||
Mat Binaire(X,Y,CV_8UC1);
|
cv::Mat binaire(X,Y,CV_8UC1);
|
||||||
imshow("Image", frame);
|
cv::imshow("Image", frame);
|
||||||
GaussianBlur(frame, frame, Size(7,7), 1.5, 1.5);
|
cv::GaussianBlur(frame, frame, cv::Size(7,7), 1.5, 1.5);
|
||||||
X=frame.rows;
|
X=frame.rows;
|
||||||
Y=frame.cols;
|
Y=frame.cols;
|
||||||
DIM=frame.channels();
|
DIM=frame.channels();
|
||||||
for (index=0,indexNB=0;index<DIM*X*Y;index+=DIM,indexNB++)
|
|
||||||
{
|
filter(frame, binaire, seuil);
|
||||||
detect=0;
|
|
||||||
B=frame.data[index ];
|
cv::imshow("Detection", binaire);
|
||||||
G=frame.data[index + 1];
|
cv::findContours(binaire, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
|
||||||
R=frame.data[index + 2];
|
cv::Mat Dessin = cv::Mat::zeros(X,Y, CV_8UC1);
|
||||||
if ((R>G) && (R>B))
|
|
||||||
if (((R-B)>=seuil) || ((R-G)>=seuil))
|
|
||||||
detect=1;
|
|
||||||
if (detect==1)
|
|
||||||
Binaire.data[indexNB]=255;
|
|
||||||
else
|
|
||||||
Binaire.data[indexNB]=0;
|
|
||||||
}
|
|
||||||
imshow("Detection", Binaire);
|
|
||||||
findContours(Binaire, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
|
|
||||||
Mat Dessin = Mat::zeros(X,Y, CV_8UC1);
|
|
||||||
unsigned int max = 0;
|
unsigned int max = 0;
|
||||||
int id = 0;
|
int id = 0;
|
||||||
for(numc = 0; numc<contours.size(); numc++) {
|
for(numc = 0; numc<contours.size(); numc++) {
|
||||||
|
@ -54,9 +68,9 @@ int main(int, char**)
|
||||||
id = numc;
|
id = numc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
drawContours(Dessin, contours, id, 255);
|
cv::drawContours(Dessin, contours, id, 255);
|
||||||
imshow("Contours", Dessin);
|
cv::imshow("Contours", Dessin);
|
||||||
if(waitKey(30) == 27) {
|
if(cv::waitKey(30) == 27) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue