Пример #1
0
void CChildView::OnImgprcThinning() 
{
	 Thinning(m_hDIB);	
	//在屏幕上显示位图
	CDC* pDC=GetDC();
	DisplayDIB(pDC,m_hDIB);	
}
std::vector<int> LightplaneCalibrator::AddLightImage(
    std::vector<cv::Mat>& srcs_light) {

  std::vector<int> return_value;
  std::vector<cv::Point>::iterator begin_100, end_900, itr;
  ims_points_.clear();
  for (int i = 0; i < srcs_light.size(); i++) {
    std::vector<cv::Point> pts; std::vector<cv::Point2f> ptfs;
    cv::Mat im = srcs_light[i], gray;
    if (im.channels() == 3) {
      cvtColor(im, gray, CV_BGR2GRAY);
    }
    else {
      gray = im;
    }
    cam_->UndistorImage(gray, gray);
    medianBlur(gray, gray, 11);
    cv::Mat threshold_out;
    cv::threshold(gray, threshold_out, 25, 255, CV_THRESH_BINARY);
    cv::Mat dialateStructure = cv::getStructuringElement(
      cv::MorphShapes::MORPH_RECT, cv::Size(15, 15));

    dilate(threshold_out, threshold_out, dialateStructure, cv::Point(-1, -1));
#ifdef _DEBUG_JIANG_  // for debug
    cv::namedWindow("threshold_medianBlur_out");
    cv::imshow("threshold_medianBlur_out", threshold_out);
    /*imwrite("threshold_medianBlur_out.bmp",threshold_out);*/
    cv::waitKey(200);
#endif
    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    findContours(threshold_out, contours, hierarchy, CV_RETR_EXTERNAL,
      CV_CHAIN_APPROX_NONE, cv::Point(0, 0));

    /// Draw contours
    cv::Mat drawing = cv::Mat::zeros(threshold_out.size(), CV_8U);
    for (size_t i = 0; i < contours.size(); i++) {
      if (contours[i].size() > 200) {
        //Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
        drawContours(drawing, contours, (int)i, cv::Scalar(255),
          CV_FILLED, 8, hierarchy, 0, cv::Point());

      }
    }
    cv::Mat  thining_output;
    Thinning(drawing, thining_output);
#ifdef _DEBUG_JIANG_
    cv::imshow("thining_output", thining_output);
    cv::waitKey(200);
#endif
    findNonZero(thining_output, pts);
    for (itr = pts.begin(); itr != pts.end(); ++itr) {
      if ((*itr).y <= 100) {
        begin_100 = itr;
      }
      if ((*itr).y <= 900) {
        end_900 = itr;
      }
    }
    ptfs.assign(begin_100, end_900);
    ims_points_.push_back(ptfs);
  }
  //std::ofstream log;
  //log.open("ims_points.txt");
  //for (int i = 0; i < ims_points_.size(); i++) {
  //  for (int j = 0; j < ims_points_[i].size(); j++) {
  //    log << ims_points_[i][j].x << " " << ims_points_[i][j].y << " " << i + 1 
  //        << std::endl;

  //  }
  //  log << std::endl;
  //}
  return return_value;
}