====== 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.