未解决的问题:image作为找到的图片。save(_ T(' o;));将DetectImg控件保存到此项目文件中,以便可以使用导入的图片。

其实我知道有点不好,但是我现在目前没有找到资料去定义全局变量,也就是将 OpenImg控件读入的图片设置为全局变量Mat ,这样就可以给DetectImg控件使用了,然后检测人脸,然后而且可以直接在原图上圈出人脸,然后显示在右边窗口。

这次问题解决了。

故意找了一张很垃圾像素的照片来测试,效果还是很理想的,所以可以用,欢迎学习。

代码如下:

[html] view plain copy

  1. void CfacedectectMFC3Dlg::OnBnClickedReading()
  2. {
  3. CStatic* pStatic = (CStatic*)GetDlgItem(IDC_reading);
  4. /*Crect lRect;
  5. pStatic->GetClientRect(&lRect);
  6. pStatic->GetDC()->FillSolidRec, lRect.top, lRect.Width(), lRect.Height(), RGB(240, 240, 240));*/
  7. pStatic->SetBitmap(NULL);
  8. CFileDialog dlg(TRUE, _T(".jpg"), _T(""), OFN_OVERWRITEPROMPT, _T("JPG File(*.jpg)|*.jpg|"));
  9. if () == IDOK)
  10. {
  11. CString sFilePath = dlg.GetPathName();
  12. string filepath = CT2A(sFilePath);
  13. readimage = imread(filepath, 1);
  14. if (!readimage.empty())
  15. {
  16. CRect rect;
  17. GetDlgItem(IDC_reading)->GetClientRect(rect);
  18. cv::namedWindow("myshowWnd", WINDOW_NORMAL);
  19. cv::resizeWindow("myshowWnd", rect.Width(), rect.Height());
  20. HWND hWnd = (HWND)cvGetWindowHandle("myshowWnd");
  21. HWND hParent = ::GetParent(hWnd);
  22. ::SetParent(hWnd, GetDlgItem(IDC_reading)->m_hWnd);
  23. ::ShowWindow(hParent, SW_HIDE);
  24. imshow("myshowWnd", readimage);
  25. imshow("readimage", readimage);
  26. }
  27. else
  28. {
  29. MessageBox(_T("JPG file is empty"));
  30. return;
  31. }
  32. }
  33. waitKey(10);
  34. }

[html] view plain copy

  1. // TODO: 在此添加控件通知处理程序代码
  2. /////////////////////////////////////
  3. //// 这一段用于检测人脸,后期可 ////
  4. //// 自定义子函数,增加程序可读性 ////
  5. /////////////////////////////////////
  6. //1.加载分类器
  7. CascadeClassifier cascade;
  8. ca(";);
  9. // ca(";);
  10. Mat dstImg, grayImg;
  11. CString strFilePath;
  12. //2.读取图片
  13. dstImg = readimage.clone();
  14. grayImg.create(readimage.size(), readimage.type());
  15. cvtColor(readimage, grayImg, CV_BGR2GRAY);//生成灰度图,提高检测效率
  16. //定义7种颜色,用于标记人脸
  17. Scalar colors[] =
  18. {
  19. //红橙黄绿青蓝紫
  20. CV_RGB(255, 0, 0),
  21. CV_RGB(255, 97, 0),
  22. CV_RGB(255, 255, 0),
  23. CV_RGB(0, 255, 0),
  24. CV_RGB(0, 255, 255),
  25. CV_RGB(0, 0, 255),
  26. CV_RGB(160, 32, 240)
  27. };
  28. //3.检测
  29. vector<Rect> rect;
  30. ca(grayImg, rect, 1.1, 3, 0);//分类器对象调用
  31. // printf("检测到人脸个数:%dn", rect.size());
  32. //4.标记–在脸部画圆
  33. for (int i = 0; i < rect.size(); i++)
  34. {
  35. Point center;
  36. int radius;
  37. cen = cvRound((rect[i].x + rect[i].width * 0.5));
  38. cen = cvRound((rect[i].y + rect[i].height * 0.5));
  39. radius = cvRound((rect[i].width + rect[i].height) * 0.25);
  40. circle(dstImg, center, radius, colors[i % 7], 2);
  41. }
  42. imwrite("a;, dstImg);
  43. CRect rect1;
  44. GetDlgItem(IDC_detect)->GetClientRect(rect1);
  45. cv::namedWindow("mydetect", WINDOW_NORMAL);
  46. cv::resizeWindow("mydetect", rec(), rec());
  47. HWND hWnd = (HWND)cvGetWindowHandle("mydetect");
  48. HWND hParent = ::GetParent(hWnd);
  49. ::SetParent(hWnd, GetDlgItem(IDC_detect)->m_hWnd);
  50. ::ShowWindow(hParent, SW_HIDE);
  51. imshow("mydetecty", dstImg);
  52. imshow("mydetect", dstImg);

上面的代码已经很完美了,但是我觉得还不够完美,就是:MFC更新图像时,旧位置的图像怎么清除?

相关推荐