OpenCV C ++, почему я получаю черный экран без использования функции обнуления?

#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 рисовать черное изображение, показывая только контурные линии.

1

Решение

Согласно документация 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: функция осьминога там может быть использован для печати типа изображения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]