witam,
mam problem z moim programem do pracy inżynierskiej. Pisze w bibliotece opencv i mam. Mój program rysuje histogram dla kilku malutkich kwadracików (10x10) wyszczególnionych ze zdjęcia w pętli for. W momencie, gdy trafia na obraz, gdzie jest jakaś linie (krawędź) to histogram jest szeroki, a gdy w tym kwadraciku obraz jest jednolity (np. kawałek ściany) to histogram jest wąski. I tutaj pojawia się problem, ponieważ nie wiem jak napisać, żeby program wybierał z pośród histogramów ten, który histogram na który pojawiła się jakaś krawędź. Poniżej zamieszczam mój program.
#include <cv.h>
#include <highgui.h>
IplImage* image= 0;
IplImage* image1= 0;
IplImage* imgHistogram = 0;
IplImage* gray= 0;
CvHistogram* hist;
int main(){
image1 = cvLoadImage("ks.jpg",1);
cvNamedWindow("original1",1);
cvShowImage( "original1", image1 );
image = cvLoadImage( "ks.jpg",1);
for (int
m=0; m<278; m=m+25)
{
cvSetImageROI(image, cvRect(300,m,10,10)) ;
//okreslenie rozmiaru histogramu (ilości koszy)
int size[] = {256};
//wartość kosza i jego znormalizowana wartość
float val;
int norm;
//zakres jasności
float range[] = { 0, 256 };
float* ranges[] = { range };
//wartość minimalna i maksymalna histogramu
float min_val = 0, max_val = 0;
//konwersja wejsciowego obrazu kolorowego do 8 bitowego w skali szarości
gray = cvCreateImage( cvGetSize(image), 8, 1 );
cvCvtColor( image, gray, CV_BGR2GRAY );
//IplImage * out = cvCreateImage (cvGetSize (gray), IPL_DEPTH_8U, 1);
//Tworzenie okien do pokazania rezultatu
cvNamedWindow("original",1);
// cvNamedWindow("gray",1);
cvNamedWindow("histogram",1);
//obrazy z których zostanie obliczony histogram
IplImage* images[] = { gray };
// przygotowanie pustego histogramu
hist = cvCreateHist( 1, size, CV_HIST_ARRAY, ranges,1);
// obliczenie histogramu z obrazów
cvCalcHist( images, hist, 0, NULL);
// znalezienie minimalnej i maksymalnej wartości histo
cvGetMinMaxHistValue( hist, &min_val, &max_val);
// tworzenie 8bitowego obrazu do pokazania histogramu
imgHistogram = cvCreateImage(cvSize(256, 50),8,1);
// wypełnienie go białym kolorem
cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,50),
CV_RGB(255,255,255),CV_FILLED);
//rysowanie histogramu jasności pikseli znormalizowanego od 0 do 50
for(int i=0; i < 256; i++){
val = cvQueryHistValue_1D( hist, i);
norm = cvRound(val*50/max_val);
cvLine(imgHistogram,cvPoint(i,50), cvPoint(i,50-norm),CV_RGB(0,0,0));
}
//pokazanie okien z rezultatem
cvShowImage( "original", image );
cvShowImage( "histogram", imgHistogram );
cvWaitKey();
cvReleaseImage( &gray);
cvReleaseImage( &imgHistogram);
}
// Niszczy okno
cvResetImageROI(image);
cvDestroyAllWindows();
return 0;
}