Sto tentando di utilizzare opencv per trovare e individuare automaticamente tutti i punti di parcheggio in un parcheggio vuoto.Utilizzo di OpenCV per rilevare i punti di parcheggio
Attualmente, ho un codice che limita l'immagine, applica il canny edge detection, e quindi usa le linee di un anello probabilistico per trovare le linee che segnano ciascun posto di parcheggio.
Il programma poi disegna le linee ei punti che compongono le linee
Ecco il codice:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int threshold_value = 150;
int threshold_type = 0;;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;
int houghthresh = 50;
char* trackbar_value = "Value";
char* window_name = "Find Lines";
int main(int argc, char** argv)
{
const char* filename = argc >= 2 ? argv[1] : "pic1.jpg";
VideoCapture cap(0);
Mat src, dst, cdst, tdst, bgrdst;
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
createTrackbar(trackbar_value,
window_name, &threshold_value,
max_value);
while(1)
{
cap >> src;
cvtColor(src, dst, CV_RGB2GRAY);
threshold(dst, tdst, threshold_value, max_BINARY_value,threshold_type);
Canny(tdst, cdst, 50, 200, 3);
cvtColor(tdst, bgrdst, CV_GRAY2BGR);
vector<Vec4i> lines;
HoughLinesP(cdst, lines, 1, CV_PI/180, houghthresh, 50, 10);
for(size_t i = 0; i < lines.size(); i++)
{
Vec4i l = lines[i];
line(bgrdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,255,0), 2, CV_AA);
circle(bgrdst,
Point(l[0], l[1]),
5,
Scalar(0, 0, 255),
-1,
8);
circle(bgrdst,
Point(l[2], l[3]),
5,
Scalar(0, 0, 255),
-1,
8);
}
imshow("source", src);
imshow(window_name, bgrdst);
waitKey(1);
}
return 0;
}
Attualmente, il mio problema principale è capire come estrapolare i dati della linea per trovare le posizioni di ogni parcheggio. Il mio obiettivo è di aprire i parcheggi e tracciare rettangoli su ogni parcheggio con un numero che identifica i punti.
Penso che ci siano alcuni problemi principali con il metodo che sto usando attualmente, perché come mostrato nelle immagini di output, opencv sta rilevando più punti sulla linea diversi dai 2 endpoint. Ciò potrebbe rendere molto difficile l'utilizzo di opencv per connettere 2 endpoint adiacenti.
Ho letto qualcosa sull'uso dello scafo convesso, ma non sono esattamente sicuro di ciò che fa e come funziona.
Qualsiasi aiuto sarà apprezzato. Qui ci sono le immagini in uscita dal mio programma: http://imageshack.us/photo/my-images/22/test1hl.png/
http://imageshack.us/photo/my-images/822/test2lw.png/
È possibile includere gli input senza elaborazione? Per il problema di rilevare più linee/punti rispetto a quello che si sta cercando, RANSAC è probabilmente in grado di risolvere meglio tale problema piuttosto che affidarsi a Hough. – mmgp
Una cosa che mi viene in mente è innanzitutto [dilatare] (http://docs.opencv.org/modules/imgproc/doc/filtering.html#dilate) l'immagine per rendere le linee più sottili. Allora forse opencv rileverà solo i 2 punti finali per linea. –
@TomKnapen stai mescolando la dilatazione con l'erosione. In questi esempi, le linee sono luminose, quindi una dilatazione le renderà più grandi. Quindi sostituiamo il tuo suggerimento all'erosione. Ora puoi spezzare le linee sottili. Ma questo è irrilevante in realtà, sta usando Canny che dà bordi con uno spessore largo. – mmgp