//修改自https://visualgdb.com/tutorials/raspberry/opencv/camera/
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <ctime>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char **argv)
{
int threshold = 100;
const int frameDelay = 100, maxContours = 500;
Mat image;
if (2 == argc)
{
image = imread(argv[1]);
}
else
{
cout << "usage: " << argv[0] << " + imageFileName" << endl;
return -1;
}
if (image.empty())
{
cout << argv[1] << " is empty" << endl;
return -2;
}
const char szSourceWindow[] = "Source", szContoursWindow[] = "Contours";
namedWindow(szSourceWindow, WINDOW_AUTOSIZE);
namedWindow(szContoursWindow, WINDOW_AUTOSIZE);
createTrackbar("Threshold:", szSourceWindow, &threshold, 255, NULL);
for (;;)
{
RNG rng(12345);
Mat smallImage;
resize(image, smallImage, Size(), 0.5, 0.5);
imshow(szSourceWindow, smallImage);
Mat canny_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Canny(smallImage, canny_output, threshold, threshold * 2, 3);
findContours(canny_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
for (size_t i = 0; i < std::min(contours.size(), (size_t)maxContours); i++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, contours, (int)i, color, 2, 8, hierarchy, 0, Point());
}
imshow(szContoursWindow, drawing);
char c = (char)waitKey(frameDelay);
if (27 == c || ' ' == c || 'q' == c)
{
break;
}
}
cout << "done" << endl;
return 0;
}
结果: