使用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;
}
相关推荐
肉包_5111 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
Trouvaille ~2 小时前
【Linux】UDP Socket编程实战(一):Echo Server从零到一
linux·运维·服务器·网络·c++·websocket·udp
HellowAmy2 小时前
我的C++规范 - 线程池
开发语言·c++·代码规范
czy87874752 小时前
const 在 C/C++ 中的全面用法(C/C++ 差异+核心场景+实战示例)
c语言·开发语言·c++
十五年专注C++开发2 小时前
MinHook:Windows 平台下轻量级、高性能的钩子库
c++·windows·钩子技术·minhook
一只小小的芙厨3 小时前
寒假集训笔记·树上背包
c++·笔记·算法·动态规划
以卿a3 小时前
C++(继承)
开发语言·c++·算法
czxyvX3 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++
xsc-xyc3 小时前
RuntimeError: Dataset ‘/data.yaml‘ error ❌ ‘_lz
人工智能·深度学习·yolo·计算机视觉·视觉检测
你真是饿了4 小时前
1.C++入门基础
开发语言·c++