OPENCV C++(六)canny边缘检测+仿射变换+透射变换

这篇具有很好参考价值的文章主要介绍了OPENCV C++(六)canny边缘检测+仿射变换+透射变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图像的缩放

	resize(image, image, Size(round(image.cols * 0.5), round(image.rows * 0.5)));

 输入图像 输出图像 大小变换

canny边缘算子的使用

	cvtColor(image, gray, COLOR_BGR2GRAY);
	Canny(gray, canny_mat, 40, 100);

 必须先转化为灰度图,作为输入 超过100是真的边缘 低于40是确定不是边缘 在中间若连接边缘 则为边缘 

普通旋转缩放变换(仿射变换)

 获取仿射变换矩阵

	float angel = -10.0, scale = 1;
	Mat dstmat;
	Point2f center(image.cols * 0.5, image.rows * 0.5);
	Mat affine_matrix = getRotationMatrix2D(center, angel, scale);

获取仿射变换的矩阵 中心点 旋转角度 大小是否变换

-10是顺时针转

仿射变换函数

warpAffine(image, dstmat, affine_matrix,image.size());

输入图 输出图 仿射变换矩阵 画布的大小 

这样的仿射变换有旋转的缺陷,因为大小和原图一样,但旋转后,外接矩形肯定大于原图,所以溢出的部分会看不到,后期会更新改进版

点到点的仿射变换(6变量 所以要3个点对3个点)

	Mat affine_Mat;
	const cv::Point2f src_pt[] = {
		  cv::Point2f(100,100),
		  cv::Point2f(20,30),
		  cv::Point2f(70,90),
	};
	const cv::Point2f warp_pt[] = {
		  cv::Point2f(50,100),
		  cv::Point2f(50,20),
		  cv::Point2f(70,96),
	};

	Mat affine_matrix2 = cv::getAffineTransform(src_pt, warp_pt);

	warpAffine(image, affine_Mat, affine_matrix2,image.size());

一个点对应一个点 

计算机会帮我们求出仿射变换的矩阵

点到点的透射变换(8变量 所以要4个点对4个点)

	Mat perspective_Mat;
	cv::Point2f pts1[] = {
		cv::Point2f(150,150),
		cv::Point2f(150,300),
		cv::Point2f(350,300),
		cv::Point2f(350,150),

	};
	cv::Point2f pts2[] = {
	cv::Point2f(200,150),
	cv::Point2f(200,300),
	cv::Point2f(340,270),
	cv::Point2f(340,180),
	};

	Mat perspective_matrix = cv::getPerspectiveTransform(pts1, pts2);
	warpPerspective(image, perspective_Mat, perspective_matrix, image.size());

 总体代码:文章来源地址https://www.toymoban.com/news/detail-628252.html

#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;


int main() {
	Mat image = imread("lena.jpeg");
	imshow("lena", image);
	waitKey(0);
	cvDestroyAllWindows();

	resize(image, image, Size(round(image.cols * 0.5), round(image.rows * 0.5)));
	imshow("lena", image);
	waitKey(0);
	cvDestroyAllWindows();

	Mat gray;
	Mat canny_mat;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Canny(gray, canny_mat, 40, 100);
	imshow("canny_mat", canny_mat);
	waitKey(0);
	cvDestroyAllWindows();	

	float angel = -10.0, scale = 1;
	Mat dstmat;
	Point2f center(image.cols * 0.5, image.rows * 0.5);
	Mat affine_matrix = getRotationMatrix2D(center, angel, scale);
	warpAffine(image, dstmat, affine_matrix,image.size());
	imshow("dstmat", dstmat);
	waitKey(0);
	cvDestroyAllWindows();


	Mat affine_Mat;
	const cv::Point2f src_pt[] = {
		  cv::Point2f(100,100),
		  cv::Point2f(20,30),
		  cv::Point2f(70,90),
	};
	const cv::Point2f warp_pt[] = {
		  cv::Point2f(50,100),
		  cv::Point2f(50,20),
		  cv::Point2f(70,96),
	};

	Mat affine_matrix2 = cv::getAffineTransform(src_pt, warp_pt);

	warpAffine(image, affine_Mat, affine_matrix2,image.size());
	imshow("affine_Mat", affine_Mat);
	waitKey(0);
	cvDestroyAllWindows();



	Mat perspective_Mat;
	cv::Point2f pts1[] = {
		cv::Point2f(150,150),
		cv::Point2f(150,300),
		cv::Point2f(350,300),
		cv::Point2f(350,150),

	};
	cv::Point2f pts2[] = {
	cv::Point2f(200,150),
	cv::Point2f(200,300),
	cv::Point2f(340,270),
	cv::Point2f(340,180),
	};

	Mat perspective_matrix = cv::getPerspectiveTransform(pts1, pts2);
	warpPerspective(image, perspective_Mat, perspective_matrix, image.size());
	imshow("perspective_Mat", perspective_Mat);
	waitKey(0);
	cvDestroyAllWindows();

	//疑问 图像的平移如何实现  image.size()是什么个东西 如何改变图像大小?


	
	return 0;
}

到了这里,关于OPENCV C++(六)canny边缘检测+仿射变换+透射变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • opencv(23) Canny边缘检测流程(Canny算子)

    opencv(23) Canny边缘检测流程(Canny算子)

    Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法 , 最优边缘检测的三个主要评价标准是: 低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。 高定位性: 标识出的边缘要与图像中的实

    2024年04月11日
    浏览(15)
  • opencv-Canny 边缘检测

    opencv-Canny 边缘检测

    Canny边缘检测是一种经典的图像边缘检测算法,它在图像中找到强度梯度的变化,从而 识别出图像中的边缘 。 Canny边缘检测的优点包括高灵敏度和低误检率。 在OpenCV中, cv2.Canny() 函数用于执行Canny边缘检测。 基本语法如下: 参数说明: image : 输入图像,通常为灰度图像。

    2024年02月22日
    浏览(13)
  • 【OpenCV】第十章: Canny边缘检测

    【OpenCV】第十章: Canny边缘检测

    第十章: Canny边缘检测 canny边缘检测是一种一阶微分算子检测算法,但为什么还要单独拿出来讲呢,因为它几乎是边缘检测算子中最优秀的边缘检测算子,你很难找到一种边缘检测算子能显著地比Canny算子做的更好。 Canny提出了边缘检测算子优劣评判的三条标准: 1、较高的检

    2024年02月03日
    浏览(8)
  • opencv(七)Canny边缘检测和图像轮廓检测

    opencv(七)Canny边缘检测和图像轮廓检测

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 1、检测步骤 1)使用高斯滤波器,以平滑图像,滤掉噪声。 2)计算图像中每个像素点的梯度强度和方向 3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应 4)应用双阈值(

    2024年02月04日
    浏览(9)
  • Python Opencv实践 - Canny边缘检测

    Python Opencv实践 - Canny边缘检测

     

    2024年02月11日
    浏览(13)
  • 【OpenCV实现图像梯度,Canny边缘检测】

    【OpenCV实现图像梯度,Canny边缘检测】

    OpenCV中,可以使用各种函数实现图像梯度和Canny边缘检测,这些操作对于图像处理和分析非常重要。 图像梯度通常用于寻找图像中的边缘和轮廓。在OpenCV中,可以使用cv2.Sobel()函数计算图像的梯度,该函数可以计算图像在水平和垂直方向上的梯度。梯度的方向和大小可以帮助

    2024年02月07日
    浏览(8)
  • OpenCV自学笔记十四:Canny边缘检测

    Canny边缘检测是一种经典的图像边缘检测算法,具有以下几个步骤: 1. 噪声抑制:首先对图像进行平滑处理,以去除图像中的噪声。常用的方法是应用高斯滤波器。 2. 计算梯度:通过对平滑后的图像应用Sobel算子(或其他梯度算子),计算图像的梯度幅值和梯度方向。梯度表

    2024年02月08日
    浏览(10)
  • 【OpenCV • c++】图像几何变换 | 图像仿射变换

    【OpenCV • c++】图像几何变换 | 图像仿射变换

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(37)
  • opencv 边缘检测 cv2.Canny()详解

    👨‍💻 个人简介: 深度学习图像领域工作者 🎉 总结链接:              链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:                     📌 1.工作中常用深度学习脚本                     📌 2.to

    2024年02月03日
    浏览(45)
  • OpenCV 笔记(12):常用的边缘检测算子—— Canny

    OpenCV 笔记(12):常用的边缘检测算子—— Canny

    一阶导数、二阶导数的边缘算子虽然简单易用,但存在一些缺点。例如容易受噪声影响,容易产生虚假边缘。 John F. Canny 在 1986 年提出了 Canny 边缘检测算法。它是结合了梯度计算方法和非极大值抑制技术的一种边缘检测算法。该算法克服了之前的边缘检测算法在抑制噪声和保

    2024年02月03日
    浏览(6)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包