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());
es sei denn, Studenten umarmt werden (Konturen überlappen) – martijnn2008
ha ha. Sie sitzen auf verschiedenen Stühlen Ich denke, –
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. –