opencv_c++学习(二十三)

这篇具有很好参考价值的文章主要介绍了opencv_c++学习(二十三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、点拟合操作

opencv_c++学习(二十三)
拟合含义如上图,即为通过已知点去拟合一条直线或者一个多边形。

直线拟合函数:

fitLine(lnputArray points, OutputArray line, int distType, double param, double reps, double aeps)

points:输入待拟合直线的2D或者3D点集。
line:输出描述直线的参数,2D点集描述参数为Vec4f类型,3D点集描述参数为Vec6f类型。
distType: M-estimator算法使用的距离类型标志。
param:某些类型距离的数值参数©。如果数值为0,则自动选择最佳值。
reps:坐标原点与直线之间的距离精度,数值0表示选择自适应参数,一般常选择0.01。
acps:直线角度精度,数值0表示选择自适应参数,一般常选择0.01。
opencv_c++学习(二十三)

圆形拟合操作:

minEnclosingCircle(InputArray points, Point2f & center,float & radius)

points:待寻找包围圆形的2D点集。
center:圆形的圆心。
radius:圆形的半径。
三角形拟合操作:

minEnclosingTriangle(lnputArray points, OutputArray triangle)

points:待寻找包围三角形的2D点集。
triangle:拟合出的三角形三个顶点坐标。
本节应用案例如下:

int main() {

	//定义一个随机点图像
	Mat img(500, 500, CV_8UC3, Scalar::all(0));

	//生成随机点
	RNG& rng = theRNG();

	while (true)
	{
		int i, count = rng.uniform(1, 101);
		vector<Point>points;
		//生成随机点
		for ( i = 0; i < count; i++)
		{
			Point pt;
			pt.x = rng.uniform(img.cols / 4, img.cols * 3 / 4);
			pt.y = rng.uniform(img.rows / 4, img.rows * 3 / 4);
			points.push_back(pt);
		}

		//寻找包围点集的三角形
		vector<Point2f> triangle;
		minEnclosingTriangle(points, triangle);

		//寻找包围点集的圆形
		Point2f center;
		float radius = 0;
		minEnclosingCircle(points, center, radius);


		//输出图片
		img = Scalar::all(0);
		Mat img2;
		img.copyTo(img2);

		//在图像中绘制坐标点
		for ( i = 0; i < count; i++)
		{
			circle(img, points[i], 3, Scalar(255, 255, 255), FILLED, LINE_AA);
			circle(img2, points[i], 3, Scalar(255, 255, 255), FILLED, LINE_AA);
		}

		//绘制三角形
		for ( i = 0; i < 3; i++)
		{
			if (i == 2)
			{
				line(img, triangle[i], triangle[0], Scalar(255, 255, 255), 1, 16);
				break;
			}
			line(img, triangle[i], triangle[i + 1], Scalar(255, 255, 255), 1, 16);
		}

		//绘制圆形
		circle(img2, center, cvRound(radius), Scalar(255, 255, 255), 1, LINE_AA);

		//输出结果
		imshow("q", img);
		imshow("w", img2);

		//按ESC键退出程序
		char key = (char)waitKey();
		if (key == 27||key == 'q'||key=='Q')
		{
			break;
		}
	}
	return 0;
}

二、二维码的识别

opencv_c++学习(二十三)
二维码的定位函数:

detect (InputArray img, OutputArray points) const

img:待检测是否含有QR二维码的灰度图像或者彩色图像。
points:包含QR二维码的最小区域四边形的四个顶点坐标,即二维码的四个顶点坐标。
二维码识别函数:

QRCodeDetectore:decode(lnputArray img, lnputArraypoints, outputArray straight_qrcode = noArray())

img:含有QR二维码的图像。
points:包含QR二维码的最小区域四边形的四个顶点坐标。straight_qrcode:经过校正和二值化的QR二维码。
二维码定位与识别函数:

detectAndDecode(InputArray limg, OutputArray points = noArray(), OutputArray straight_qrcode = noArray())

img:含有QR二维码的图像。
points:包含QR二维码的最小区域四边形的四个顶点坐标。straight_qrcode:经过校正和二值化的QR二维码。

本节应用案例如下:文章来源地址https://www.toymoban.com/news/detail-463762.html

int main() {

	//读取图片
	Mat src = imread("3.jpg");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//转化为灰度图
	Mat gray, qrcode_bin;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	QRCodeDetector qrcodeDetector;

	//存储坐标
	vector<Point> points;
	string information;
	bool isQRcode;

	//识别二维码
	isQRcode = qrcodeDetector.detect(gray, points);

	//对二维码进行解码操作
	if (isQRcode)
	{
		information = qrcodeDetector.decode(gray, points, qrcode_bin);

		//输出二维码四个顶点的坐标
		cout << points << endl;
	}

	else
	{
		return -1;
	}

	//绘制二维码边框
	for (int i = 0; i < points.size(); i++)
	{
		if (i == points.size()-1)
		{
			line(src, points[i], points[0], Scalar(0, 0, 255), 2, 8);
			break;
		}
		line(src, points[i], points[i+1], Scalar(0, 0, 255), 2, 8);
	}

	//将解码内容输出到图片上
	putText(src, information.c_str(), Point(20, 30), 0, 1.0, Scalar(0, 0, 255), 2, 8);

	//使用函数直接定位二维码并解码
	string information2;
	vector<Point> points2;
	information2 = qrcodeDetector.detectAndDecode(gray, points2);
	//输出二维码四个顶点的坐标
	cout << points << endl;
	//将解码内容输出到图片上
	putText(src, information2.c_str(), Point(20, 30), 0, 1.0, Scalar(0, 0, 255), 2, 8);

	imshow("q", src);
	imshow("w", WINDOW_NORMAL);
	imshow("e", qrcode_bin);

	waitKey(0);
	return 0;
}

到了这里,关于opencv_c++学习(二十三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv_c++学习(二十二)

    图中左侧为边缘检测的效果,中间为图像经过二值化的效果,右图为凸包检测效果。 points:输入的2D点集。 hull:输出凸包的顶点。 clockwise:方向标志,当参数为true时,凸包顺序为顺时针方向,否则为逆时针方向。 returnPoints:输出数据的类型标志,当参数为true时第二个参数输出的

    2024年02月06日
    浏览(70)
  • opencv_c++学习(二十七)

    上图为针孔相机成像原理,蓝色坐标中的O即为镜头光心。成像原理与小孔成像相同。 单目相机映射关系如下: 将上式进行变换,就可以从三位空间映射到2维平面的公式。 相机的畸变公式如下: objectPoints:世界坐标系中3D点的三维坐标。 rvec:世界坐标系变换到相机坐标系的旋

    2024年02月06日
    浏览(53)
  • opencv_c++学习(三)

    CV Assert(mylmage.depth() == CV 8U); CV_Assert()函数判断图像数据的类型是否为uchar类型,不满足则抛出异常。 Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。 Mat.ptr(int i=0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。 获取当前像素点P(row, col)的像素值

    2024年02月03日
    浏览(33)
  • opencv_c++学习(六)

    对以上实例解释如下: 若读取的为本地视频,则filename为视频名称,若读取的是摄像头数据,则为int类型的摄像头id。 视频属性可以通过get()函数获取。 见文末案例 对以上实例进行解释: filename:保存视频的地址和文件名,包含视频格式; fourcc:压缩帧的4字符编解码器代码,

    2024年02月03日
    浏览(37)
  • opencv_c++学习(三十)

    model:模型文件名称 config:配置文件名称 framework:框架种类 Net类中的函数名称以及作用: 向网络层中添加数据: blob:新的输入数据,数据类型为CV_32F或CV_8U。 name:输入网络层的名称。 scalefactor:可选的标准化比例(尺寸缩放)。 mean:可选的减数数值(平移)。 opencv调用深度学习模

    2024年02月06日
    浏览(39)
  • opencv_c++学习(一)

    本人所用环境为: win10 opencv3.4.16 VScode2017 opencv的官网为: https://opencv.org/ 点开之后我们选择library,下图红框 进入之后我们选择自已要搭建的opencv版本,我这里选择的3.4.16,Windows版本。 下载完成之后我们就可以用下载的文件进行自解压了: 选择自己要安装的位置 安装完成后我

    2023年04月08日
    浏览(41)
  • OpenCV(二十三):中值滤波

    1.中值滤波的原理        中值滤波(Median Filter)是一种常用的非线性图像滤波方法,用于去除图像中的椒盐噪声等离群点。它的原理是基于邻域像素值的排序,并将中间值作为当前像素的新值。 2.中值滤波函数 medianBlur() void cv::medianBlur ( InputArray   src, OutputArray dst, int  

    2024年02月09日
    浏览(55)
  • 操作系统原理 —— 文件的逻辑结构(二十三)

    这里说的 逻辑结构 ,就是指在用户看来,文件内部的数据应该是如何组织起来的,而 物理结构 指的是在操作系统看来,文件的数据是如何被存放的。 从 逻辑结构 结构来看,我们可以打开一个记事本,里面的文字内容从用户的角度来看就是无结构的,但是又从 Excel 来看,

    2024年02月08日
    浏览(62)
  • 鸿蒙开发系列教程(二十三)--List 列表操作(2)

    在列表项之间添加间距,可以使用space参数,主轴方向 List({ space: 10 }) { … } 分隔线用来将界面元素隔开,使单个元素更加容易识别。 startMargin和endMargin属性分别用于设置分隔线距离列表侧边起始端的距离和距离列表侧边结束端的距离 List() { … } .divider({ strokeWidth: 1, startMargi

    2024年02月19日
    浏览(77)
  • 【JavaSE】Java基础语法(二十三):递归与数组的高级操作

    递归的介绍 以编程的角度来看,递归指的是方法定义中调用方法本身的现象 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算 递归的基本使用 递归的注意事项 递归一定要有出口。否

    2024年02月06日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包