使用c++视觉处理canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测
#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;
}
文章来源地址https://www.toymoban.com/news/detail-725509.html
调用本地相机实时检测:canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测
#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;
}
文章来源:https://www.toymoban.com/news/detail-725509.html
到了这里,关于使用c++视觉处理----canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!