Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C - OpenCV] riconoscere pixel più "rosso"

    Salve ragazzi, sto facendo un piccolo progetto in C con le librerie OpenCV.
    Ho attaccato un puntatore laser (rosso) alla webcam, e quello che mi "serve" di fare in poche parole è riconoscere il puntino nelle foto della webcam, calcolare la distanza (contare il numero di pixel) dal puntino al centro dell'immagine e tracciare due righe (perpendicolari) rosse che dividono in 4 l'immagine e che si intersecano sul puntino formando una specie di croce..

    Ho scaricato svariati manuali di OpenCV (a dire il vero è da un po' che le uso ma mi sono sempre tenuto molto "in superficie" ed ora volevo scendere un pochino più a fondo).
    Naturalmente non vi chiedo il codice già bello che fatto altrimenti che gusto c'è? :P
    A parte gli scherzi non lo farei mai
    Comunque il primo grosso scoglio che non riesco a superare neanche con quei manuali è praticamente l'inizio......come posso fare per far riconoscere al programma quel benedetto puntino rosso? In testa ho una soluzione del tipo:
    codice:
    int i, j; //variabili che utilizzerò nei cicli per "scansionare" pixel per pixel l'immagine
    int max_rosso[2]; //array nel quale salverò riga e colonna relative al pixel più rosso
    for(i=0; i<immagine->height; i++){
         for(j=0; j<immagine->width; j++){
              Se trovi un punto "più rosso" del precedente{
                         max_rosso[0] = i; //altezza
                         max_rosso[1] = j; //larghezza
              }
         }
    }
    Ora, come traduco quel "Se trovi un punto "più rosso" del precedente" in C?

    Per ora la mia domanda è questa..spero che qualche buon anima di voi mi aiuti e la ringrazio in anticipo, ciao!!

  2. #2
    Ciao ragazzi, nel frattempo mi sono studiato una possibile soluzione: ho scoperto che con le opencv si può misurare l'intensità di un pixel e così mi sono detto "quasi quasi metto l'immagine in scala di grigi almeno il pallino del laser viene molto più luminoso" e in effetti è così (: così ho buttato giù questo codice:
    codice:
    #include <stdio.h>
    #include "opencv2/highgui/highgui.hpp"
    #include <cv.h>
    
    int main(){
    	//preparo la grandezza dell'immagine cavia
    	CvSize size = cvSize(640, 480);
    	//dichiaro l'immagine campione
    	IplImage *image;
    	//creo l'immagine cavia
    	IplImage *img = cvCreateImage(size, IPL_DEPTH_8U, 1);
    	//catturo una foto dall'immagine campione
    	CvCapture *capture = cvCreateCameraCapture(0);
    	image = cvQueryFrame(capture);
    
    	//converto l'immagine campione in scala di grigi nell'immagine cavia
    	cvCvtColor(image, img, CV_RGB2GRAY);
    	//la visualizzo
    	cvNamedWindow("IMAGE", CV_WINDOW_AUTOSIZE);
    	cvShowImage("IMAGE", img);
    
    	//ne prelevo altezza e larghezza
    	int h, w;
    	h = img->height;
    	w = img->width;
    	//controllo
    	printf("h: %ipx, w: %ipx, ch: %i", h, w, img->nChannels);
    	if(img->depth == IPL_DEPTH_8U)
    		printf(" depth: 8u");
    	//attendo pressione di un tasto
    	cvWaitKey(0);
    
    	//valore da confrontare
    	double val = 0;
    	//oggetti per le funzioni Get/Set 2D
    	CvScalar its, set;
    	//oggetti per i cicli
    	int i, j, imgArr[2];
    
    	//ciclo di controllo dell'intensità dei pixel
    	for(i = 0; i < h; i++){
    		for(j = 0; j < w; j++){
    			its = cvGet2D(img, i, j); //-->questa è la parte di codice che non funziona
    			if(its.val[0] > val){
    				val = its.val[0];
    				imgArr[0] = i; //h
    				imgArr[1] = j; //w
    			}
    		}
    	}
    
    	//setto lo scalare a 255 (bianco)
    	set.val[0] = 255;
    	//ciclo che crea la croce bianca
    	for(i = 0; i < w; i++){
    		cvSet2D(img, imgArr[0], i, set);
    	}
    	for(i = 0; i < h; i++){
    		cvSet2D(img, i, imgArr[1], set);
    	}
    	cvShowImage("IMAGE", img);
    	//printf("h%i . w%i", imgArr[0], imgArr[1]);
    
    	//attendo la pressione di un tasto
    	cvWaitKey(0);
    
            //rilascio le risorse
    	cvDestroyWindow("IMAGE");
    	cvReleaseCapture(&capture);
    	cvReleaseImage(&image);
    	cvReleaseImage(&img);
    	return 0;
    }
    Mi sono assicurato che tutto fosse scritto a dovere, di non aver omesso niente..e mi pare che fili tutto liscio, ma non è così a quanto pare.
    La famosa funzione che si dovrebbe occupare di individuare l'intensità di un pixel (la cvGet2D() ) fa le bizze..per la cvSet2D() non ci sono problemi ma questa mi manda in palla tutto

    prima mi aveva dato un errore che ora non mi da più (non mi ricordo nemmeno che errore era sinceramente), comunque appena arriva al pezzo di codice relativo alla cvGet2D() si blocca tutto, e mi manda il classico "il programma non funziona: Windows sta cercando una soluzione bla bla bla -> chiudi programma"

    Dov'è che sbaglio?

  3. #3
    Se lo esegui in un debugger che errore ottieni?
    In ogni caso, piuttosto che lavorare con un'immagine in scala di grigi io lavorerei sull'intensità della componente "rosso" dell'immagine originale RGB...
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Ciao MItaly, non capisco..l'ho fatto partire in debugging da eclipse e mi da "No source available for "cvSet2D() at 0x61cd5c1b" " ...se però modifico il programma e mi tengo solo il codice della set2D funziona, per la get2D no ...non ci sto capendo niente pensavo che l'errore fosse della get

    Comunque ma per trovare solo l'intensità di rosso dovrei fare un controllo sul primo valore del vettore "val" del CvScalar?
    Esempio:
    CvScalar scalar = cvGet2D(img, i, j);
    e poi controllo "scalar.val[0]"?

  5. #5
    ho eliminato la parte della set, facendo il debug "istruzione per istruzione" ora mi si blocca sulla cvReleaseCapture() -.-

    No source available for "cvReleaseCapture() at 0x702444a7"

    mi devo preoccupare? è un problema di librerie?

  6. #6
    Ecco mi ha dato un errore molto simile a quello che non mi ricordavo sulla console, riporto di seguito:
    codice:
    OpenCV Error: Bad argument (unrecognized or unsupported array type) in cvPtr2D, file C:/slave/WinInstallerMegaPack/src/opencv/modules/core/src/array.cpp, line 1830
    
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    terminate called after throwing an instance of 'cv::Exception'
      what():  C:/slave/WinInstallerMegaPack/src/opencv/modules/core/src/array.cpp:1830: error: (-5) unrecognized or unsupported array type in function cvPtr2D

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.