Esempio n. 1
0
Qt::WindowFrameSection OverlayEditorScene::rectSection(const QRectF &qrf, const QPointF &qp, qreal dist) {
	qreal left, right, top, bottom;

	top = distancePointLine(qrf.topLeft(), qrf.topRight(), qp);
	bottom = distancePointLine(qrf.bottomLeft(), qrf.bottomRight(), qp);
	left = distancePointLine(qrf.topLeft(), qrf.bottomLeft(), qp);
	right = distancePointLine(qrf.topRight(), qrf.bottomRight(), qp);

	if ((top < dist) && (top < bottom)) {
		if ((left < dist) && (left < right))
			return Qt::TopLeftSection;
		else if (right < dist)
			return Qt::TopRightSection;
		return Qt::TopSection;
	} else if (bottom < dist) {
		if ((left < dist) && (left < right))
			return Qt::BottomLeftSection;
		else if (right < dist)
			return Qt::BottomRightSection;
		return Qt::BottomSection;
	} else if (left < dist) {
		return Qt::LeftSection;
	} else if (right < dist) {
		return Qt::RightSection;
	}
	if (qrf.contains(qp))
		return Qt::TitleBarArea;

	return Qt::NoSection;
}
static void drawEpipolarLines(const std::string& title, const cv::Matx<T1, 3, 3> F, const cv::Mat& img1, const cv::Mat& img2,
    const std::vector<cv::Point_<T2> > points1, const std::vector<cv::Point_<T2> > points2, const float inlierDistance = -1) {

  CV_Assert(img1.size() == img2.size() && img1.type() == img2.type());
  cv::Mat outImg(img1.rows, img1.cols * 2, CV_8UC3);
  cv::Rect rect1(0, 0, img1.cols, img1.rows);
  cv::Rect rect2(img1.cols, 0, img1.cols, img1.rows);
  /*
   * Allow color drawing
   */
  if (img1.type() == CV_8U) {
    cv::cvtColor(img1, outImg(rect1), CV_GRAY2BGR);
    cv::cvtColor(img2, outImg(rect2), CV_GRAY2BGR);
  } else {
    img1.copyTo(outImg(rect1));
    img2.copyTo(outImg(rect2));
  }
  std::vector<cv::Vec<T2, 3> > epilines1, epilines2;
  cv::computeCorrespondEpilines(points1, 1, F, epilines1); //Index starts with 1
  cv::computeCorrespondEpilines(points2, 2, F, epilines2);

  CV_Assert(points1.size() == points2.size() && points2.size() == epilines1.size() && epilines1.size() == epilines2.size());

  cv::RNG rng(0);
  for (size_t i = 0; i < points1.size(); i++) {
    if (inlierDistance > 0) {
      if (distancePointLine(points1[i], epilines2[i]) > inlierDistance || distancePointLine(points2[i], epilines1[i]) > inlierDistance) {
        //The point match is no inlier
        continue;
      }
    }
    /*
     * Epipolar lines of the 1st point set are drawn in the 2nd image and vice-versa
     */
    cv::Scalar color(rng(256), rng(256), rng(256));
    cv::Mat temp = outImg.clone();
    cv::Mat tmp2 = outImg(rect2);
    cv::Mat tmp1 = outImg(rect1);
    //outImg.copyTo(temp);

    cv::line(tmp2, cv::Point(0, -epilines1[i][2] / epilines1[i][1]),
        cv::Point(img1.cols, -(epilines1[i][2] + epilines1[i][0] * img1.cols) / epilines1[i][1]), color);
    cv::circle(tmp1, points1[i], 3, color, -1, CV_AA);

    cv::line(tmp1, cv::Point(0, -epilines2[i][2] / epilines2[i][1]),
        cv::Point(img2.cols, -(epilines2[i][2] + epilines2[i][0] * img2.cols) / epilines2[i][1]), color);
    cv::circle(tmp2, points2[i], 3, color, -1, CV_AA);
  }
  cv::imshow(title, outImg);
  cv::waitKey(1);
}
static void myDrawEpipolarLines(const std::string& title, const cv::Matx<T1, 3, 3> F, const cv::Mat& img1, const cv::Mat& img2,
    const std::vector<cv::Point_<T2> > points1, const std::vector<cv::Point_<T2> > points2) {

  cv::Mat outImg(img1.rows, img1.cols, CV_8UC3);

  cv::Mat outImgInit(img1.rows, img1.cols, CV_8UC3);

  if (img1.type() == CV_8U) {
    cv::cvtColor(img1, outImg, CV_GRAY2BGR);
  } else {
    img1.copyTo(outImg);
  }

  outImg.copyTo(outImgInit);
  std::vector<cv::Vec<T2, 3> > epilines;
  cv::computeCorrespondEpilines(points1, 1, F, epilines);

  for (size_t i = 0; i < points1.size(); i++) {

    cv::Mat outImg2(img1.rows, img1.cols, CV_8UC3);
    outImgInit.copyTo(outImg2);

    cv::line(outImg2, cv::Point(0, -epilines[i][2] / epilines[i][1]),
        cv::Point(img1.cols, -(epilines[i][2] + epilines[i][0] * img1.cols) / epilines[i][1]), cv::Scalar(255, 0, 0));
    cv::circle(outImg2, points2[i], 3, cv::Scalar(0, 255, 255), 2);
    cv::line(outImg, cv::Point(0, -epilines[i][2] / epilines[i][1]),
        cv::Point(img1.cols, -(epilines[i][2] + epilines[i][0] * img1.cols) / epilines[i][1]), cv::Scalar(255, 0, 0));
    cv::circle(outImg, points2[i], 3, cv::Scalar(0, 255, 255), 2);

    std::cout << "Current Distance to point" << points2[i] << ": " << distancePointLine(points2[i], epilines[i]) << std::endl;
    cv::imshow(title, outImg2);
    cv::waitKey(0);
  }
  cv::imshow(title, outImg);
  cv::waitKey(0);
}