#include <opencv2/core/core.hpp>
#include "opencv2/imgproc/imgproc.hpp"#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main( int argc, char** argv ){
//sets up image you want
Mat img = imread("shape.jpg",CV_LOAD_IMAGE_GRAYSCALE);
//checks to see if image was read
if(img.empty()){
cout<<"Image not found"<<endl;
return -1;
}
//identifies the edges on the picture
Canny(img, img, 200, 200,3 );
//creates a vector of all the points that are contoured
vector<vector<Point>> contours;
//needed for function
vector<Vec4i> hierarchy;
//finds all the contours in the image and places it into contour vector array
findContours( img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
Mat drawing = Mat::zeros( img.size(), CV_8UC3 );
//loop allows you to re-draw out all the contours based on the points in the vector
for( int i = 0; i< contours.size(); i++ )
{
drawContours( drawing, contours, i, Scalar(0,255,0), 2, 8, hierarchy, 0, Point());
}
//shows the images
imshow("Pic",drawing);
waitKey(0);
destroyWindow("Pic");}
Почему мне нужна линия?
Mat drawing = Mat::zeros( img.size(), CV_8UC3 );
Например, если я закомментирую эту строку, а затем в остальной части кода ниже заменим переменную «Drawing» на «IMG», как получится, что при запуске я получу черный экран? Вместо того, чтобы просто хитрое преобразованное изображение, которое делает остальную часть фотографии кроме черных линий контура? Из того, что я прочитал, я предполагаю, что функция нуля изменяет значения матрицы на рисунке до 0, делая его черным, что затем заставляет цикл for рисовать черное изображение, показывая только контурные линии.
Согласно документация findContours()
:
image — Источник, 8-битное одноканальное изображение. Ненулевые пиксели рассматриваются как 1. Нулевые пиксели остаются 0, поэтому изображение рассматривается как двоичный файл … Функция модифицирует изображение при извлечении контуров.
В частности, он изменяет тип изображения на 8UC1. Наконец, функция drawContours()
печатает контур черным, так как использует Scalars(0,255,0)
, Если бы вы использовали Scalar(255,0,0)
вопрос остался бы незамеченным.
Просто измените звонок на drawContours()
:
drawContours( img, contours, i, Scalar(255), 2, 8, hierarchy, 0, Point());
PS: функция осьминога там может быть использован для печати типа изображения.
Других решений пока нет …