Может кто-нибудь объяснить об обнаружении MultiScale в openCV

Я пытался ObjectDetection в OpenCV ..

Выполнено несколько шагов ..

  1. Изменение размера до разрешения 64х64
  2. Меняя его на серую шкалу
  3. Извлечение XML для обнаружения объектов
  4. Рисование прямоугольника окантовкой узора

Тем не менее, я не мог этого достичь ..

Вот мой код:

#include<iostream>
#include "cv.h"#include "highgui.h"#include<vector>

using namespace cv;
using namespace std;

int main()
{
IplImage* img;
img = cvLoadImage( "hindi3.jpg" );

vector<cv::Rect> objects;

// ***Resize image to 64x64 resolution***

IplImage *resizeImage = cvCreateImage(cvSize(64,64),8,3);

cvResize(img,resizeImage,CV_INTER_LINEAR);

cvShowImage("Resize",resizeImage);
cvWaitKey(0);

// ***Convert image to grayscale***

IplImage *grayImage = cvCreateImage(cvGetSize(resizeImage),8,1);

cvCvtColor(resizeImage,grayImage,CV_BGR2GRAY);

cvShowImage("gray",grayImage);
cvWaitKey(0);

// ***Getting the XML (Cascade xml generated thru haarTraining)***

CvMemStorage* storage = cvCreateMemStorage(0);
cout<<"Memory created\n";

cv::CascadeClassifier cascade;
cascade.load("cascade.xml");
//CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "cascade.xml" );
cout<<"cascade.xml loaded successfully\n";
double scale = 1.3;

static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}},
{{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} };

// ***Detect objects***

cvClearMemStorage( storage );
objects.clear();
//CvSeq* objects = cvHaarDetectObjects( grayImage, cascade, storage, 1.1, 4, 0, cvSize( 40, 50 ));
//cascade.detectMultiScale(grayImage, objects, 1.2, 4, CV_HAAR_DO_CANNY_PRUNING, cvSize(30, 30));
cascade.detectMultiScale(grayImage, objects, 1.2, 4, CV_HAAR_SCALE_IMAGE, cvSize(30, 30));

// ***Draw a rectangle outside recognized pattern***

cout<<"Object size : "<<objects.size();
for( vector<cv::Rect>::const_iterator r = objects.begin(); r != objects.end(); r++)
{            //rectangle(img, *r, Scalar(0,0,255), 2, 8, 0);
cvRectangle( grayImage, cvPoint( r->x, r->y ), cvPoint( r->x + r->width, r->y + r->height ),Scalar(0,0,255));
cout<<"In the loop\n";
}

cvNamedWindow( "Output" );
cvShowImage( "Output", grayImage );
cvWaitKey(0);

cvReleaseImage(&resizeImage);
cvReleaseImage(&grayImage);
cvReleaseImage( &img );

return 0;
}

Размер объекта, напечатанный мной, показывает, к сожалению, 0 🙁 Следовательно, это не идет в цикл for .. Может кто-нибудь помочь мне ..

заранее спасибо

PS: я прокомментировал некоторые строки в коде, которые были бесполезны. Пожалуйста, дай мне знать, могу ли я включить то же самое.

1

Решение

Нашел ответ ..! Я пропустил указанные аргументы для функции detectMultiScale.

Работает нормально .. Проверенный код выглядит следующим образом

#include<iostream>
#include "cv.h"#include "highgui.h"#include<vector>

using namespace cv;
using namespace std;

int main()
{

IplImage* img;
img = cvLoadImage( "test.jpg" );

vector<cv::Rect> objects;

/*** Resizing is optional***
*****************************

IplImage *resizeImage = cvCreateImage(cvSize(64,64),8,3);

cvResize(img,resizeImage,CV_INTER_LINEAR);
cvShowImage("Resize",resizeImage);
cvWaitKey(0);*/

/*** Change image into grayscale***
**********************************/

IplImage *grayImage = cvCreateImage(cvGetSize(img),8,1);
cvCvtColor(img,grayImage,CV_BGR2GRAY);

//cvEqualizeHist(grayImage,grayImage); This is optionalcvShowImage("gray",grayImage);
cvWaitKey(0);

CvMemStorage* storage = cvCreateMemStorage(0);
cout<<"Memory created\n";

/*** Load the XML generated through haartraining***
**************************************************/

cv::CascadeClassifier cascade;
cascade.load("cascade.xml");
//CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "cascade.xml" );
cout<<"cascade.xml loaded successfully\n";
double scale = 1.3;

static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}},
{{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} };

/*** Detect objects***
**********************/

cvClearMemStorage( storage );
objects.clear();
//CvSeq* objects = cvHaarDetectObjects( grayImage, cascade, storage, 1.1, 4, 0, cvSize( 40, 50 ));
//cascade.detectMultiScale(grayImage, objects, 1.2, 4, CV_HAAR_DO_CANNY_PRUNING, cvSize(30, 30)); if captured through WebCam
cascade.detectMultiScale(grayImage, objects, 1.1, 3, CV_HAAR_SCALE_IMAGE | CV_HAAR_DO_CANNY_PRUNING,cvSize(0,0), cvSize(100,100));

cout<<"Object size : "<<objects.size();

/***Draw Rectangle outside recognized pattern***
***********************************************/

for( vector<cv::Rect>::const_iterator r = objects.begin(); r != objects.end(); r++)
{            //rectangle(img, *r, Scalar(0,0,255), 2, 8, 0);
cvRectangle( grayImage, cvPoint( r->x, r->y ), cvPoint( r->x + r->width, r->y + r->height ),Scalar(0,0,255));
cout<<"In the loop\n";
}

cvNamedWindow( "Output" );
cvShowImage( "Output", grayImage );
cvWaitKey(0);

//cvReleaseImage(&resizeImage); If resized
cvReleaseImage(&grayImage);
cvReleaseImage( &img );

return 0;
}

И наконец это сработало ..!

PS: эта программа работает только тогда, когда ввод снимка происходит в отличие от веб-камеры или видео.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector