기타

테두리 추출

카멜레온개발자 2020. 2. 13. 13:26

웹에서 이것저것 검색하면서 짬뽕으로 테두리 추출함

 

다음에 써 먹을 데가 있을라나?

 

#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

string title = "Main Window";

int threshold_min = 200;
int threshold_max = 255;
int obj_index = 0;

void onChange(int value, void* userdata) {
	cout << "Value : " << value << endl;
}



int main()
{

	namedWindow(title, WINDOW_AUTOSIZE);
	createTrackbar("Min Threshold", title, &threshold_min, 255,  onChange);
	createTrackbar("Max Threshold", title, &threshold_max, 255, onChange);
	createTrackbar("Object",        title, &obj_index,     255, onChange);

	cv::VideoCapture cap(0);
	cv::Mat image, gray, binary, draw;

	vector<vector<Point> > contours;
	vector<Vec4i> hierarchy;

	while (true) {

		//cap >> image;

		image = cv::imread("image.png");
		draw = image.clone();
		draw = 0;

		//cap.read(image);
		// check if we succeeded

		if (image.empty()) {
			std::cerr << "ERROR! blank frame grabbed\n";
			break;
		}

		cv::cvtColor(image, gray, cv::COLOR_RGB2GRAY);
		cv::threshold(gray, binary, threshold_min, threshold_max, cv::THRESH_BINARY);
		cv::bitwise_not(binary, binary);

		cv::findContours(binary, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
		
		Scalar color = Scalar(255, 255, 255);
		Scalar sel_color = Scalar(255, 0, 0);

		for (int i = 0; i < contours.size(); ++i)
		{
			if(obj_index == i)
				cv::drawContours(draw, contours, i, sel_color, 1);
			else
				cv::drawContours(draw, contours, i, color, 1);
		}

		cv::imshow("binary", binary);
		cv::imshow(title, image);
		cv::imshow("draw", draw);
		if (cv::waitKey(10) == 27)
			break;
	}

    return 0;
}