2016-05-13 7 views
4

Ich brauche Anleitung, um einen Code zu erreichen. Der Zweck ist, die Anzahl der Schüler zu zählen, die sich in einem Lernraum befinden. Meine Idee ist:OpeCV Leute in einem Raum zählen

1) ein Bild leer Klassenzimmer Studie 2) ein Bild zu einer Tageszeit mit den Studenten an den vorgegebenen Orten sitzen, weil die Stühle nicht beweglich sein können. 3) Definieren Sie die wichtigsten Punkte in dem Bild, das dem Klassenzimmer des Sitzes entspricht. 4) Differenz von zwei Fotos. 5) Wenn diese Posts jetzt besetzt sind (die Differenz hat ein sichtbares Ergebnis ergeben), dann zählen Sie die Anzahl der Differenz, die der Anzahl der Studenten entspricht.

Hat jemand eine Idee, wie man es im Code implementiert?

Mat differenceFrame(Mat prev_frame, Mat curr_frame); 



int main(void) { 

    cv::Mat frame, frame1, framedifference; 
    int key = 0; 

    frame = imread("2.jpg", CV_LOAD_IMAGE_COLOR); // Read the file 

     frame1 = imread("1.jpg", CV_LOAD_IMAGE_COLOR); // Read the file 

    while (key != 27){ 
     differenceFrame(frame, frame1); 

     cv::absdiff(frame, frame1, framedifference); 

     key = 0; 
     cv::imshow("stream", framedifference); 
     key = cv::waitKey(10); 
    } 


       ContPeople(framedifference) ????? 

} 

JETZT: Ich versuchte diese Lösung. Ich weiß nicht, ob es am effizientesten ist. Der Blob könnte mir helfen? Wenn ich den Unterschied des Bildes, einige reflektierende Punkte mache ich markiert sie als ob sie geändert wurden, ich denke, das ist ein Problem von zu viel Licht, können Sie den Unterschied verfeinern, diese Probleme zu vermeiden?

Lebenslauf :: Mat imgFrame1Copy = F_RoomFull.clone(); Lebenslauf :: Mat imgFrame2Copy = F_RoomEmpty.clone();

cv::Mat imgDifference; 
cv::Mat imgThresh; 

cv::cvtColor(imgFrame1Copy, imgFrame1Copy, CV_BGR2GRAY); 
cv::cvtColor(imgFrame2Copy, imgFrame2Copy, CV_BGR2GRAY); 

cv::GaussianBlur(imgFrame1Copy, imgFrame1Copy, cv::Size(5, 5), 0); 
cv::GaussianBlur(imgFrame2Copy, imgFrame2Copy, cv::Size(5, 5), 0); 

cv::absdiff(imgFrame1Copy, imgFrame2Copy, imgDifference); 

cv::threshold(imgDifference, imgThresh, 180, 255, CV_THRESH_BINARY); 

cv::imshow("imgThresh", imgThresh); 

cv::Mat structuringElement3x3 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); 
cv::Mat structuringElement5x5 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)); 
cv::Mat structuringElement7x7 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(7, 7)); 
cv::Mat structuringElement9x9 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(9, 9)); 

cv::dilate(imgThresh, imgThresh, structuringElement5x5); 
cv::dilate(imgThresh, imgThresh, structuringElement5x5); 
cv::erode(imgThresh, imgThresh, structuringElement5x5); 

cv::Mat imgThreshCopy = imgThresh.clone(); 


cv::findContours(imgThreshCopy, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); 
cv::Mat imgContours(imgThresh.size(), CV_8UC3, SCALAR_BLACK); 
cv::drawContours(imgContours, contours, -1, SCALAR_WHITE, -1); 
cv::imshow("imgContours", imgContours); 


printf("%d", contours.size()); 

Antwort

3

Wenn Sie diese beiden Bilder (Matrizen) subtrahieren, gibt es nur in den Positionen der Schüler Werte ungleich Null. Andere Werte sollten Null oder sehr nahe bei Null sein.

Setzen Sie einen Schwellenwert, um alle anderen Werte auf Null zu setzen (ich meine, wenn kleine Nullwerte an Stellen vorhanden sind, an denen sich im vorherigen Bild kein Schüler befindet).

Dann Konturerkennung durchführen. Siehe Code hier: http://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

Die Anzahl der Konturen = nein. von Studenten

Wenn sich zwei Konturen überlappen, verwenden Sie den Konturbereich, um sie zu zählen. Es wird erwartet, dass maximale Konturen nicht überlappend sind.

+0

es sei denn, Studenten umarmt werden (Konturen überlappen) – martijnn2008

+0

ha ha. Sie sitzen auf verschiedenen Stühlen Ich denke, –

+0

Auch wenn einige Konturen überlappen, können Sie sie mit Konturbereich trennen. aber wenn 3-5 Gruppen von Studenten (2/3/4 Studenten in jeder Gruppe) sich gegenseitig umarmen, dann wird es eine sehr komplexe Situation sein. Wenn 2 Schüler oder 3 Schüler von 20 sich gegenseitig umarmen, sollte das kein Problem sein. –

0

Sie können auch die Background Subtraction-Methode in OpenCv verwenden. Es gibt viele Parameter, die eine Feinabstimmung ermöglichen.

Hier ist der Link Link