使用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);
cv::Mat cannyEdges;
cv::Canny(image, cannyEdges, 50, 150);
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);
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 滤波边缘检测
#include <opencv2/opencv.hpp>
int main() {
cv::VideoCapture cap(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);
cv::Mat cannyEdges;
cv::Canny(grayImage, cannyEdges, 50, 150);
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);
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);
if (cv::waitKey(1) == 27) {
break;
}
}
return 0;
}