#include #include #include #include #include #include #include using namespace cv; struct comparator{ bool operator() (std::tuple, bool, double> t1, std::tuple, 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> contours; std::vector hierarchy; findContours( thresh, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0) ); // finding max contour std::vector, 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, 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; }