c++ 有人能解释一下openCV中的detectMultiScale吗

jei2mxaa  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(152)

我一直在尝试openCV中的对象检测。
跟着几个步骤。
1.将其调整为64x64分辨率
1.把它改成灰度
1.获取XML以进行对象检测
1.绘制矩形镶边图案
但是,我没能做到。
下面是我的代码:

  1. #include<iostream>
  2. #include "cv.h"
  3. #include "highgui.h"
  4. #include<vector>
  5. using namespace cv;
  6. using namespace std;
  7. int main()
  8. {
  9. IplImage* img;
  10. img = cvLoadImage( "hindi3.jpg" );
  11. vector<cv::Rect> objects;
  12. // ***Resize image to 64x64 resolution***
  13. IplImage *resizeImage = cvCreateImage(cvSize(64,64),8,3);
  14. cvResize(img,resizeImage,CV_INTER_LINEAR);
  15. cvShowImage("Resize",resizeImage);
  16. cvWaitKey(0);
  17. // ***Convert image to grayscale***
  18. IplImage *grayImage = cvCreateImage(cvGetSize(resizeImage),8,1);
  19. cvCvtColor(resizeImage,grayImage,CV_BGR2GRAY);
  20. cvShowImage("gray",grayImage);
  21. cvWaitKey(0);
  22. // ***Getting the XML (Cascade xml generated thru haarTraining)***
  23. CvMemStorage* storage = cvCreateMemStorage(0);
  24. cout<<"Memory created\n";
  25. cv::CascadeClassifier cascade;
  26. cascade.load("cascade.xml");
  27. //CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "cascade.xml" );
  28. cout<<"cascade.xml loaded successfully\n";
  29. double scale = 1.3;
  30. static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}},
  31. {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} };
  32. // ***Detect objects***
  33. cvClearMemStorage( storage );
  34. objects.clear();
  35. //CvSeq* objects = cvHaarDetectObjects( grayImage, cascade, storage, 1.1, 4, 0, cvSize( 40, 50 ));
  36. //cascade.detectMultiScale(grayImage, objects, 1.2, 4, CV_HAAR_DO_CANNY_PRUNING, cvSize(30, 30));
  37. cascade.detectMultiScale(grayImage, objects, 1.2, 4, CV_HAAR_SCALE_IMAGE, cvSize(30, 30));
  38. // ***Draw a rectangle outside recognized pattern***
  39. cout<<"Object size : "<<objects.size();
  40. for( vector<cv::Rect>::const_iterator r = objects.begin(); r != objects.end(); r++)
  41. { //rectangle(img, *r, Scalar(0,0,255), 2, 8, 0);
  42. cvRectangle( grayImage, cvPoint( r->x, r->y ), cvPoint( r->x + r->width, r->y + r->height ),Scalar(0,0,255));
  43. cout<<"In the loop\n";
  44. }
  45. cvNamedWindow( "Output" );
  46. cvShowImage( "Output", grayImage );
  47. cvWaitKey(0);
  48. cvReleaseImage(&resizeImage);
  49. cvReleaseImage(&grayImage);
  50. cvReleaseImage( &img );
  51. return 0;
  52. }

字符串
我打印出来的对象大小显示为0,因此,它没有进入for循环.
PS:我已经在代码中注解了一些没有用的行。请让我知道我是否可以合并相同的。

weylhg0b

weylhg0b1#

找到答案了..!我遗漏了detectMultiScale函数的指定参数。
它的工作正常..纠正代码如下

  1. #include<iostream>
  2. #include "cv.h"
  3. #include "highgui.h"
  4. #include<vector>
  5. using namespace cv;
  6. using namespace std;
  7. int main()
  8. {
  9. IplImage* img;
  10. img = cvLoadImage( "test.jpg" );
  11. vector<cv::Rect> objects;
  12. /*** Resizing is optional***
  13. *****************************
  14. IplImage *resizeImage = cvCreateImage(cvSize(64,64),8,3);
  15. cvResize(img,resizeImage,CV_INTER_LINEAR);
  16. cvShowImage("Resize",resizeImage);
  17. cvWaitKey(0);*/
  18. /*** Change image into grayscale***
  19. **********************************/
  20. IplImage *grayImage = cvCreateImage(cvGetSize(img),8,1);
  21. cvCvtColor(img,grayImage,CV_BGR2GRAY);
  22. //cvEqualizeHist(grayImage,grayImage); This is optional
  23. cvShowImage("gray",grayImage);
  24. cvWaitKey(0);
  25. CvMemStorage* storage = cvCreateMemStorage(0);
  26. cout<<"Memory created\n";
  27. /*** Load the XML generated through haartraining***
  28. **************************************************/
  29. cv::CascadeClassifier cascade;
  30. cascade.load("cascade.xml");
  31. //CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "cascade.xml" );
  32. cout<<"cascade.xml loaded successfully\n";
  33. double scale = 1.3;
  34. static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}},
  35. {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} };
  36. /*** Detect objects***
  37. **********************/
  38. cvClearMemStorage( storage );
  39. objects.clear();
  40. //CvSeq* objects = cvHaarDetectObjects( grayImage, cascade, storage, 1.1, 4, 0, cvSize( 40, 50 ));
  41. //cascade.detectMultiScale(grayImage, objects, 1.2, 4, CV_HAAR_DO_CANNY_PRUNING, cvSize(30, 30)); if captured through WebCam
  42. cascade.detectMultiScale(grayImage, objects, 1.1, 3, CV_HAAR_SCALE_IMAGE | CV_HAAR_DO_CANNY_PRUNING,cvSize(0,0), cvSize(100,100));
  43. cout<<"Object size : "<<objects.size();
  44. /***Draw Rectangle outside recognized pattern***
  45. ***********************************************/
  46. for( vector<cv::Rect>::const_iterator r = objects.begin(); r != objects.end(); r++)
  47. { //rectangle(img, *r, Scalar(0,0,255), 2, 8, 0);
  48. cvRectangle( grayImage, cvPoint( r->x, r->y ), cvPoint( r->x + r->width, r->y + r->height ),Scalar(0,0,255));
  49. cout<<"In the loop\n";
  50. }
  51. cvNamedWindow( "Output" );
  52. cvShowImage( "Output", grayImage );
  53. cvWaitKey(0);
  54. //cvReleaseImage(&resizeImage); If resized
  55. cvReleaseImage(&grayImage);
  56. cvReleaseImage( &img );
  57. return 0;
  58. }

字符串
终于成功了!
PS:这个程序只有当输入是通过图像拍摄时才有效,不像网络摄像头或视频。

展开查看全部

相关问题