绘制棋盘格角点

绘制棋盘格角点

#include<opencv2/opencv.hpp>

std::vector<cv::Point2f> myFindCorners(int rows, int cols, cv::Mat mat) {
	cv::Mat mat_copy = mat;
	cv::Mat gray = mat_copy;
	//cv::cvtColor(mat_copy, gray, CV_BGRA2GRAY);

	//棋盘规格,长宽-1
	int h = rows;
	int w = cols;

	//保存角点
	std::vector<cv::Point2f> corners;
	corners.resize(gray.cols * gray.rows);
	memset(corners.data(), 0, corners.size() * sizeof(cv::Point2f));

	//使用棋盘坐标
	bool patternWasFound = cv::findChessboardCorners(gray, cv::Size(h, w),
		corners, cv::CALIB_CB_ADAPTIVE_THRESH);

	if (!patternWasFound) {
		std::cout << "获取角点失败" << std::endl;
		return cv::Mat();
	}

	//画角点
	//cv::drawChessboardCorners(mat_copy, cv::Size(h, w), corners, patternWasFound);

	//算法收敛,迭代次数或EPS
	cv::TermCriteria termCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 20, 0.1);

	//亚像素角点检测
	cv::cornerSubPix(gray, corners, cv::Size(11, 11), cv::Size(-1, -1), termCriteria);
	//将检测到的亚像素角点绘制到原图上
	//std::cout << corners.size() << std::endl;

	return corners;

	/*
	for (std::vector<cv::Point2f>::iterator it = corners.begin();
		it != corners.end(); it++)
	{
		cv::circle(mat_copy, *it, 3, cv::Scalar(0, 0, 255), 1, 8, 0);
	}
	//cv::calibrateCamera(,);
	//cv::namedWindow("corners", CV_WINDOW_AUTOSIZE);
	//cv::imshow("corners", corners);

	return mat_copy;
	*/
}

int main() {

	cv::Mat mat = cv::imread("D:\\pic\\.bmp", 
		CV_LOAD_IMAGE_GRAYSCALE);
	cv::Mat dst, thresh;
	cv::threshold(mat, thresh, 0, 255, CV_THRESH_OTSU | CV_THRESH_BINARY_INV);

	std::vector<cv::Point2f> corners;//提供初始角点的坐标位置和精确的坐标的位置
	int maxcorners = 10000;
	double qualityLevel = 0.01;  //角点检测可接受的最小特征值
	double minDistance = 100;	//角点之间最小距离
	int blockSize = 3;//计算导数自相关矩阵时指定的领域范围
	double  k = 0.04; //权重系数

	goodFeaturesToTrack(thresh, corners, maxcorners, qualityLevel,
		minDistance, cv::Mat(), blockSize, false, k);

	//myFindCorners(100, 100, mat);
	//绘制角点
	cv::cvtColor(mat, mat, CV_GRAY2BGR);
	cv::RNG rng(12345);
	for (unsigned i = 0; i < corners.size(); i++)
	{
		circle(mat, corners[i], 2, cv::Scalar(0, 0, 255), -1, 8, 0);

		/*
		circle(img, corners[i], 2, cv::Scalar(rng.uniform(0, 255),
			rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, 0);
		*/

		//std::cout << "角点坐标:" << corners[i] << std::endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值