123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- #include <opencv2/imgproc.hpp>
- #include <opencv2/highgui.hpp>
- #include <opencv2/opencv.hpp>
- #include <vector>
- #include <algorithm>
- #include <tuple>
- #include <iostream>
- using namespace cv;
- struct comparator{
- bool operator() (std::tuple<std::vector<cv::Point>, bool, double> t1,
- std::tuple<std::vector<cv::Point>, bool, double> t2) {
- return std::get<2>(t1) > std::get<2>(t2);
- }
- } comparator;
- int main(int, char**)
- {
- // get image
- cv::Mat image = cv::imread("C:\\Users\\Sky\\Downloads\\name.png");
- cv::Mat grayImg;
- // convert to greyscale
- cv::cvtColor(image, grayImg, COLOR_BGRA2GRAY);
- // cv::Mat canny;
- // cv::Canny(grayImg,canny, 120, 255, 3);
- // finding threshes
- cv::Mat thresh;
- cv::threshold(grayImg,thresh, 127, 255, THRESH_BINARY_INV | THRESH_OTSU);
- // finding contours
- std::vector<std::vector<cv::Point>> contours;
- std::vector<cv::Vec4i> hierarchy;
- findContours( thresh, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0) );
- // finding max contour
- std::vector<std::tuple<std::vector<cv::Point>, bool, double>> vec;
- for(size_t i = 0; i < contours.size(); ++i){
- vec.push_back(std::make_tuple(contours.at(i), cv::isContourConvex(contours.at(i)),cv::contourArea(contours.at(i))));
- }
- std::sort(vec.begin(), vec.end(), comparator);
- std::tuple<std::vector<cv::Point>, bool, double> maxContour;
- maxContour = vec.at(0);
- // create mask
- cv::Mat mask = Mat::zeros(thresh.size(), CV_8U);
- for(size_t i = 0; i < contours.size(); ++i){
- cv::fillConvexPoly(mask, std::get<0>(vec.at(i)), Scalar(255,0,0),8,0);
- }
- // cv::fillConvexPoly(mask, std::get<0>(maxContour), Scalar(255,0,0),8,0);
- // bitwise
- cv::Mat res;
- cv::bitwise_and(image, image, res, mask);
- // show process
- imshow("result", res);
- imshow("mask", mask);
- imshow("canny", thresh);
- imshow("source", image);
- // create transparent background
- Mat dst;
- Mat rgb[3];
- split(res,rgb);
- Mat rgba[4]={rgb[0],rgb[1],rgb[2], mask};
- merge(rgba,4,dst);
- // save to file transparent and cropped images
- imwrite("C:/Documents/1.png", res);
- imwrite("C:/Documents/dst.png",dst);
- imwrite("C:/Documents/mask.png",mask);
- imwrite("C:/Documents/thresh.png",thresh);
- imwrite("C:/Documents/src.png",image);
- while (true) {
- if (waitKey() == 27) { //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
- std::cout << "esc key is pressed by user";
- break;
- }
- }
- return 0;
- }
|