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

news/2024/11/29 16:33:02/

图像的缩放

	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());

 总体代码:

#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;
}


http://www.ppmy.cn/news/1012131.html

相关文章

降本增效,除了裁员企业还能做什么?

现在面临企业裁员的新闻时&#xff0c;我们已经非常平静淡定了。短短几个月&#xff0c;裁员潮已经从互联网高科技科技行业&#xff0c;蔓延至金融、零售、汽车等行业&#xff0c;从新闻变成常态。裁员「常态化」背后&#xff0c;是企业面临的经营压力和对降本增效的关注。 随…

在广告宣传领域,PS透明屏有哪些优点表现?

PS透明屏是一种新型的显示技术&#xff0c;它将传统的显示屏幕与透明材料相结合&#xff0c;使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性&#xff0c;通…

再探C++——默认成员函数

目录 一、构造函数 二、析构函数 三、赋值运算符 四、拷贝构造 如果一个类中没有成员&#xff0c;我们称为空类。空类&#xff0c;也存在6个默认的类成员函数。 默认成员函数&#xff1a;用户不显示地写&#xff0c;编译器会默认生成的函数叫做默认成员函数。 6个默认成员…

【一】SPI IP核使用

一、spi是串行外设接口&#xff08;serial peripheral interface&#xff09;,是高速的、全双工、同步通信总线&#xff0c;标准的spi仅仅使用4个引脚 spi ip核框图&#xff1a; 二、spi核的寄存器描述 三、配置spi核 四、SPI内核编程 alt_avalon_spi_command(alt_u32 base,alt…

VIOOVI的精益生产探析:深入了解精益生产的本质

精益生产它是利用杜绝浪费和稳定、连续生产的作业流程&#xff0c;是通过系统性的结构管理、生产人员组织以及市场端的供求现状等方面的因素做对应的调整、变革。具备有一定战斗力的生产管理体系&#xff0c;可以很快的根据市场端需求做出对应的调整&#xff0c;而且实现生产过…

React Fiber: 从 Reconciliation 到 Concurrent Mode

React Fiber 是 React 中的一种新的协调算法&#xff0c;它的主要目的是提高 React 的性能和可维护性。在 React Fiber 之前&#xff0c;React 使用了一种叫做 Stack Reconciliation 的算法来处理组件的更新和渲染。但是 Stack Reconciliation 存在一些问题&#xff0c;比如无法…

linux中彻底卸载jenkins

要彻底卸载 Jenkins&#xff0c;你需要删除与 Jenkins 相关的文件、目录和配置。以下是一些步骤: 1. **停止 Jenkins 服务&#xff1a;** 在卸载 Jenkins 之前&#xff0c;首先停止 Jenkins 服务。使用以下命令停止 Jenkins 服务&#xff1a; sudo systemctl stop jenki…

自定义Toast提示弹窗(且可旋转)

/*** 自定义 Toast* param param* title: 内容* duration&#xff1a;toast持续时间&#xff0c;单位 毫秒* rotate&#xff1a;toast可旋转的角度度数&#xff0c;单位 deg*/ export const Toast ({ title, duration 2000, rotate 0 }) > {const _duration isNaN(durat…