使用c++视觉处理----canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测

使用c++视觉处理canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测

cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
	// 读取图像
	cv::Mat image = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE); // 转为灰度图像

	if (image.empty()) {
		std::cerr << "无法加载图像" << std::endl;
		return -1;
	}

	// 创建用于显示结果的窗口
	cv::namedWindow("边缘检测结果", cv::WINDOW_AUTOSIZE);

	// Canny边缘检测
	cv::Mat cannyEdges;
	cv::Canny(image, cannyEdges, 50, 150); // 50和150是低阈值和高阈值

	// Sobel边缘检测
	cv::Mat sobelX, sobelY;
	cv::Sobel(image, sobelX, CV_16S, 1, 0);
	cv::Sobel(image, sobelY, CV_16S, 0, 1);
	cv::Mat sobelEdges;
	cv::convertScaleAbs(sobelX, sobelX);
	cv::convertScaleAbs(sobelY, sobelY);
	cv::addWeighted(sobelX, 0.5, sobelY, 0.5, 0, sobelEdges);

	// Scharr滤波边缘检测
	cv::Mat scharrX, scharrY;
	cv::Scharr(image, scharrX, CV_16S, 1, 0);
	cv::Scharr(image, scharrY, CV_16S, 0, 1);
	cv::Mat scharrEdges;
	cv::convertScaleAbs(scharrX, scharrX);
	cv::convertScaleAbs(scharrY, scharrY);
	cv::addWeighted(scharrX, 0.5, scharrY, 0.5, 0, scharrEdges);

	// 显示结果
	cv::imshow("原始图像", image);
	cv::imshow("Canny边缘检测", cannyEdges);
	cv::imshow("Sobel边缘检测", sobelEdges);
	cv::imshow("Scharr边缘检测", scharrEdges);

	cv::waitKey(0);
	return 0;
}

调用本地相机实时检测:canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测

cpp 复制代码
#include <opencv2/opencv.hpp>

int main() {
	cv::VideoCapture cap(0); // 打开本地相机(通常是0号摄像头)

	if (!cap.isOpened()) {
		std::cerr << "无法打开相机" << std::endl;
		return -1;
	}

	// 创建用于显示结果的窗口
	cv::namedWindow("实时边缘检测", cv::WINDOW_AUTOSIZE);

	while (true) {
		cv::Mat frame;
		cap >> frame; // 从相机捕获一帧图像

		if (frame.empty()) {
			std::cerr << "无法捕获图像" << std::endl;
			break;
		}

		// 转换为灰度图像
		cv::Mat grayImage;
		cv::cvtColor(frame, grayImage, cv::COLOR_BGR2GRAY);

		// Canny边缘检测
		cv::Mat cannyEdges;
		cv::Canny(grayImage, cannyEdges, 50, 150); // 50和150是低阈值和高阈值

		// Sobel边缘检测
		cv::Mat sobelX, sobelY;
		cv::Sobel(grayImage, sobelX, CV_16S, 1, 0);
		cv::Sobel(grayImage, sobelY, CV_16S, 0, 1);
		cv::Mat sobelEdges;
		cv::convertScaleAbs(sobelX, sobelX);
		cv::convertScaleAbs(sobelY, sobelY);
		cv::addWeighted(sobelX, 0.5, sobelY, 0.5, 0, sobelEdges);

		// Scharr滤波边缘检测
		cv::Mat scharrX, scharrY;
		cv::Scharr(grayImage, scharrX, CV_16S, 1, 0);
		cv::Scharr(grayImage, scharrY, CV_16S, 0, 1);
		cv::Mat scharrEdges;
		cv::convertScaleAbs(scharrX, scharrX);
		cv::convertScaleAbs(scharrY, scharrY);
		cv::addWeighted(scharrX, 0.5, scharrY, 0.5, 0, scharrEdges);

		// 显示实时边缘检测结果
		cv::imshow("原始图像", frame);
		cv::imshow("Canny边缘检测", cannyEdges);
		cv::imshow("Sobel边缘检测", sobelEdges);
		cv::imshow("Scharr边缘检测", scharrEdges);

		// 检查用户是否按下ESC键,然后退出循环
		if (cv::waitKey(1) == 27) {
			break;
		}
	}

	return 0;
}
相关推荐
XLYcmy1 小时前
京东 算法实习一面 下+手撕
c++·python·llm·概率论·数据处理·训练·codebert
反转180度2 小时前
Qt 6 + C++17 实现 SFTP 批量部署:工业设备运维工具实战解析
运维·c++·qt
动物园猫2 小时前
猪危险行为目标检测数据集:3类别、5,000+张图像 | 目标检测
人工智能·目标检测·计算机视觉
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的多继承与虚继承
开发语言·c++·面试
有点。5 小时前
C++认识数
开发语言·c++
2023自学中5 小时前
Qt 简易聊天室(第二篇),单线程 改为 多线程,方便后续增加文件传输功能
c++·qt
Tyler_TXZ6 小时前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
有点。6 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论
不会代码的小猴7 小时前
C++新增关键字
开发语言·c++·笔记
liulilittle8 小时前
并发与内存安全术语:定义、分类与关联
c++·安全·并发·术语