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


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

    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    在这里插入图片描述

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

    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
  • 相关阅读:
    代码随想录 | Day 48 - LeetCode 198. 打家劫舍、LeetCode 213. 打家劫舍II、LeetCode 337. 打家劫舍III
    猿创征文|大数据bug笔记之利用Hudi将数据落地到HDFS
    是什么让.NET7的Min和Max方法性能暴增了45倍?
    仅用30秒,Python就能学会的漂亮短代码,你学会了吗?
    用HTML+CSS+JS做一个漂亮简单的公司网站(JavaScript期末大作业)
    界面组件DevExpress WPF v23.2 - 全新升级的数据编辑器、流程图组件
    k8s - Flannel
    python脚本将json文件生成C语言结构体
    Clion C项目集成sqlite、IDE插件连接与C代码连接基本操作
    04 数学软件与建模---Lingo
  • 原文地址:https://blog.csdn.net/qq_46107892/article/details/133761708