hãy có một cái nhìn tại các mã sauSự khác nhau giữa "Edge Detection" và "Hình ảnh Contours"
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
Mat src, grey;
int thresh = 10;
const char* windowName = "Contours";
void detectContours(int,void*);
int main()
{
src = imread("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg");
//Convert to grey scale
cvtColor(src,grey,CV_BGR2GRAY);
//Remove the noise
cv::GaussianBlur(grey,grey,Size(3,3),0);
//Create the window
namedWindow(windowName);
//Display the original image
namedWindow("Original");
imshow("Original",src);
//Create the trackbar
cv::createTrackbar("Thresholding",windowName,&thresh,255,detectContours);
detectContours(0,0);
waitKey(0);
return 0;
}
void detectContours(int,void*)
{
Mat canny_output,drawing;
vector<vector<Point>> contours;
vector<Vec4i>heirachy;
//Detect edges using canny
cv::Canny(grey,canny_output,thresh,2*thresh);
namedWindow("Canny");
imshow("Canny",canny_output);
//Find contours
cv::findContours(canny_output,contours,heirachy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
//Setup the output into black
drawing = Mat::zeros(canny_output.size(),CV_8UC3);
//Draw contours
for(int i=0;i<contours.size();i++)
{
cv::drawContours(drawing,contours,i,Scalar(255,255,255),1,8,heirachy,0,Point());
}
imshow(windowName,drawing);
}
Về mặt lý thuyết, Contours
phương tiện phát hiện đường cong. Edge detection
có nghĩa là phát hiện các cạnh. Trong mã trên của tôi, tôi đã thực hiện phát hiện cạnh bằng cách sử dụng Canny
và phát hiện đường cong theo findContours()
. Sau đây là kết quả hình ảnh
Canny ảnh
Contours ảnh
OK, vì vậy bây giờ, như bạn có thể thấy, không có sự khác biệt! Vì vậy, sự khác biệt thực sự giữa 2 là gì? Trong hướng dẫn OpenCV, chỉ có mã được đưa ra. Tôi đã tìm thấy giải thích về những gì là Contours
nhưng nó không giải quyết được vấn đề này.
Vui lòng trợ giúp!
tôi đề nghị bạn sử dụng cv :: GaussianBlur() trước khi cv :: Canny(). Điều này có thể loại bỏ phần lớn sự lộn xộn trong khi vẫn giữ các cạnh chính. – Bull