Si prega di dare un'occhiata al seguente codice didifferenza tra "Rilevamento dei bordi" e "Immagine Contorni"
#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);
}
Teoricamente, Contours
mezzi di rilevamento curve. Edge detection
significa rilevare i bordi. Nel mio codice precedente, ho eseguito il rilevamento dei fronti utilizzando Canny
e il rilevamento delle curve tramite findContours()
. Di seguito sono riportate le immagini risultanti
Canny Immagine
contorni dell'immagine
OK, ora, come si può vedere, non v'è alcuna differenza! Quindi, qual è la differenza effettiva tra questi 2? Nelle esercitazioni OpenCV, viene fornito solo il codice. Ho trovato una spiegazione su ciò che è Contours
ma non sta affrontando questo problema.
Si prega di aiuto!
vi suggerisco di utilizzare cv :: GaussianBlur() prima cv :: Canny(). Questo può sbarazzarsi della maggior parte del disordine mantenendo i bordi principali. – Bull