Outils pour utilisateurs

Outils du site


diy:projets:tl_partierecepteur

Partie Récepteur

code sur github https://github.com/hiergaut/opencv/blob/master/ledTransmission/ledReceiver.cpp

la partie récepteur constituer d'un rpi avec cam, doit en premier lieu trouver la position de la led de l'émetteur depuis le VideoCapture de opencv.

L'algorithme c++ consiste pour chaque couple de frame, trouver le pixel qui a un fort changement 0 → 255 etant le max qu'on peut avoir, on travaille sur chaque composante d'un pixel donc width *length *3 cas de max possible.

On relève le pixel changeant le plus possible car avec une haute frequence de transmission on remarque que la led n'a pas le temp de s'eteindre completement du coup on ne peut dire que ca va de 0 → 255, réellement c'est plutot 200 → 255, donc on positionnera un seuil pour definir l'etat du bit reçu a 225 par exemple.

création d'une fonction c++ pour resumer tout ça

void findBlinkLed(cv::VideoCapture cap, int *pos) {
 
	bool found = false;
	cv::Mat m, m2;
 
	int occur[SIZE];
	for (int i = 0; i < SIZE; i++) {
		occur[i] = 0;
	}
 
	while (not found) {
		auto until =
			chrono::high_resolution_clock::now() + chrono::nanoseconds(PERIOD);
 
		cap >> m;
 
		this_thread::sleep_until(until);
 
		cap >> m2;
 
		uchar *p = m.data;
		uchar *p2 = m2.data;
 
		int maxGap = -1;
		int posGap = -1;
		for (int i = 0, gap; i < SIZE; i++) {
 
			gap = abs(*p++ - *p2++);
			if (gap > maxGap) {
				maxGap = gap;
				posGap = i;
			}
		}
 
		if (maxGap > THRESH) {
			if (occur[posGap]++ > 10) {
				*pos = posGap;
				found = true;
			}
		}
 
		cout << "\rmaxGap = " << maxGap << " " << flush;
 
		// 	exit(0);
	}
 
	int x = (*pos / 3) % width;
	int y = (*pos / 3) / width;
	cv::putText(m, "+", cv::Point2f(x - 15, y + 10), cv::FONT_HERSHEY_SIMPLEX,
				1, cv::Scalar(0, 255, 0), 1);
	cv::imshow("w", m);
	cv::moveWindow("w", 20, 20);
	while (cv::waitKey(100) != 27)
		;
}

pour effectuer cette opération sur l'executable définitif, il faudra passer l'option -i pour init

g++ ledReceiver.cpp `pkg-config --cflags --libs opencv` && ./a.out -i 

puis apres cela on peut réellement transmettre des données, sans option le programme attend un transmission, et prompt la chaine de charactère sur stdout.

diy/projets/tl_partierecepteur.txt · Dernière modification : 2018/05/04 12:22 de gbouyjou