Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...

Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...
 Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...

Kanal D va difuza serialul “...

Upgrade xiaomi mi11
 securitate - acum se dau drept - ...

Farmacia Dr Max - Pareri / Sugest...

De unde cumparati suspensii / gar...

[UNDE] Reconditionare obiecte lemn
 Infiltratii casa noua

sugestie usa interior

ANAF si plata la selfpay

Imprimanta ciss rezista perioade ...
 

Detectare culoare semafor cu OpenCv pe raspberry pi

- - - - -
  • Please log in to reply
8 replies to this topic

#1
cristipdt

cristipdt

    New Member

  • Grup: Members
  • Posts: 2
  • Înscris: 26.06.2014
Salut,

Am de facut un proiect in care un robot/o masinuta trebuie sa detecteze culoarea semaforului. Am folosit o camera web+raspberry si codul este scris in C cu funtii din OpenCv. Problema e ca nu prea imi detecteaza exact ce trebuie :D, adica daca este lumina mai puternica imi va da matching acolo.

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <windows.h>

using namespace std;
using namespace cv;
/// Global Variables
Mat img; Mat templ; Mat result;
Mat redLight;
Mat frame;
char* image_window = "Source Image";
char* result_window = "Result window";
Point poz[2];
int match_method;
/// Function Headers
void MatchingMethod(int, void*);
void RedLight(int, void *);
int cont = 0;
/** @function main */
void pini();//pini
int main()
{
	VideoCapture cap(0);
	CvCapture* capture = 0;
	capture = cvCaptureFromCAM(0);
	if (!capture) cout << "No camera detected" << endl;
	/// Load image and template
	char poza[100];
	redLight = imread("red.jpg", 1);
	/// Create windows
	namedWindow(image_window, CV_WINDOW_AUTOSIZE);
	namedWindow(result_window, CV_WINDOW_AUTOSIZE);

	if (capture)
	{
		cout << "In capture ..." << endl;
		for (;;)
		{
			Mat save_img; cap >> save_img;
			if (save_img.empty())
			{
				std::cerr << "Something is wrong with the webcam, could not get frame." << std::endl;
			}
			// Save the frame into a file
			imwrite("camera.jpg", save_img);
			cont = 0;
			match_method = CV_TM_SQDIFF_NORMED;
			strcpy(poza, "camera.jpg");
			img = imread(poza, 1);
			RedLight(0, 0);
			waitKey(0);
			match_method = CV_TM_CCOEFF;
			cont++;
			RedLight(0, 0);
			waitKey(0);
			if (abs(poz[0].x - poz[1].x)< 30)
			{
				cout << "Match\n";
				//pini() apel;
				//semafor rosu
			}
			else
			{
				//nu e rosu
				//forword
			}
			//Sleep(1000);
		}
	}
	return 0;
}
void RedLight(int, void *)
{
	Mat img_display;
	img.copyTo(img_display);
	/// Create the result matrix
	int result_cols = img.cols - templ.cols + 1;
	int result_rows = img.rows - templ.rows + 1;
	result.create(result_cols, result_rows, CV_32FC1);
	/// Do the Matching and Normalize
	matchTemplate(img, redLight, result, match_method);
	normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
	/// Localizing the best match with minMaxLoc
	double minVal; double maxVal; Point minLoc; Point maxLoc;
	Point matchLoc;
	minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
	/// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
	if (match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED)
	{
		matchLoc = minLoc;
	}
	else
	{
		matchLoc = maxLoc;
	}
	poz[cont] = matchLoc;
	/// Show me what you got
	rectangle(img_display, matchLoc, Point(matchLoc.x + redLight.cols, matchLoc.y + redLight.rows), Scalar::all(0), 2, 8, 0);
	rectangle(result, matchLoc, Point(matchLoc.x + redLight.cols, matchLoc.y + redLight.rows), Scalar::all(0), 2, 8, 0);
	imshow(image_window, img_display);
	imshow(result_window, result);
	return;
}



#2
Argv

Argv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,501
  • Înscris: 25.10.2007

View Postcristipdt, on 26 iunie 2014 - 13:37, said:

Salut,

Am de facut un proiect in care un robot/o masinuta trebuie sa detecteze culoarea semaforului. Am folosit o camera web+raspberry si codul este scris in C cu funtii din OpenCv. Problema e ca nu prea imi detecteaza exact ce trebuie Posted Image, adica daca este lumina mai puternica imi va da matching acolo.


Bravo! Intrebari?

#3
xxvirusxx

xxvirusxx

    Retired

  • Grup: Senior Members
  • Posts: 13,441
  • Înscris: 11.11.2005
Nu am treaba cu programarea, dar o intrebare si o idee..

Camera citeste culorile?

O idee ar fi sa folosesti ceva de genul....daca vede prima luminita=rosu, a doua=galben

#4
dexterash

dexterash

    --something---

  • Grup: Senior Members
  • Posts: 22,912
  • Înscris: 19.08.2004

View Postcristipdt, on 26 iunie 2014 - 13:37, said:

Salut,

Am de facut un proiect in care un robot/o masinuta trebuie sa detecteze culoarea semaforului. Am folosit o camera web+raspberry si codul este scris in C cu funtii din OpenCv. Problema e ca nu prea imi detecteaza exact ce trebuie Posted Image, adica daca este lumina mai puternica imi va da matching acolo.
Vezi ca(cam) pute...

Ai facut pe naiba....
N-ai folosit nimic si ai sperat sa mearga un cod copiat, nu?

Pont: RasPI nu foloseste APIul de Windows!

#5
cristipdt

cristipdt

    New Member

  • Grup: Members
  • Posts: 2
  • Înscris: 26.06.2014
Wow m-ai prins :( . Btw am uitat sa specific totul si poate de asta s-a inteles altceva.

#6
dexterash

dexterash

    --something---

  • Grup: Senior Members
  • Posts: 22,912
  • Înscris: 19.08.2004
Dar esti sigur ca macar stii ce vrei?

#7
pavel_c

pavel_c

    New Member

  • Grup: Members
  • Posts: 17
  • Înscris: 10.07.2014
In primul rand e destul de ciudat ce ai facut acolo.
Pasii pentru a detectat culoarea rosie a unui semafor (cea mai simpla varianta).
1 pornire camera
2 preluare imagine
3 gasire semafor
4 validare culoare semafor folosind componenta cbcr.

Ca si sfaturi nu mai copia imaginea din stanga in dreapta atat de mult pentru ca iti mananca timp si ai nevoie de cat mai putine operatiuni.

#8
dexterash

dexterash

    --something---

  • Grup: Senior Members
  • Posts: 22,912
  • Înscris: 19.08.2004
Nu este codul lui. Este copiat de prin alte parti. Oricum nu stie/intelege ce are de facut.

#9
pavel_c

pavel_c

    New Member

  • Grup: Members
  • Posts: 17
  • Înscris: 10.07.2014
Stiu, i-am dat pasii pentru ca sa ii fie mai simplu daca vrea sa rezolve programul (daca nu intelege e problema lui)

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate