| #include "preprocess.h" |
|
|
|
|
| void preprocessor::loadImg() |
| { |
| std::cout << "imread neko img\n"; |
| for(auto& p : std::filesystem::directory_iterator("/home/simtoon/datasets/unprocessed/neko")) |
| { |
| cv::Mat img = cv::imread(p.path().string()); |
| if(!img.empty()) |
| { |
| preprocessor::animeNekoGirls.push_back(img); |
| } |
| } |
|
|
| std::cout << "imread non_neko img\n"; |
| for(auto& p : std::filesystem::directory_iterator("/home/simtoon/datasets/unprocessed/non_neko")) |
| { |
| cv::Mat img = cv::imread(p.path().string()); |
| if(!img.empty()) |
| { |
| preprocessor::nonAnimeNekoGirls.push_back(img); |
| } |
| } |
| } |
|
|
| void preprocessor::resizeImg(int size) |
| { |
| std::cout << "resizing neko img\n"; |
| cv::Size sizeObj(size, size); |
| for(auto& img : preprocessor::animeNekoGirls) |
| { |
| cv::resize(img, img, sizeObj); |
| } |
|
|
| std::cout << "resizing non_neko img\n"; |
| for(auto& img : preprocessor::nonAnimeNekoGirls) |
| { |
| cv::resize(img, img, sizeObj); |
| } |
| } |
|
|
| void preprocessor::normalizeImg() |
| { |
| std::cout << "normalizing neko img\n"; |
| for(auto& img : preprocessor::animeNekoGirls) |
| { |
| img /= 255.0; |
| } |
|
|
| std::cout << "normalizing non_neko img\n"; |
| for(auto& img : preprocessor::nonAnimeNekoGirls) |
| { |
| img /= 255.0; |
| } |
| } |
|
|
| void preprocessor::convertToGrayscaleImg() |
| { |
| std::cout << "converting to grayscale neko img\n"; |
| for(auto& img : preprocessor::animeNekoGirls) |
| { |
| cv::cvtColor(img, img, cv::COLOR_BGR2GRAY); |
| } |
|
|
| std::cout << "converting to grayscale non_neko img\n"; |
| for(auto& img : preprocessor::nonAnimeNekoGirls) |
| { |
| cv::cvtColor(img, img, cv::COLOR_BGR2GRAY); |
| } |
| } |
|
|
| void preprocessor::blurImg(int blurType, int kerx, int kery) |
| { |
| if(blurType == 0) |
| { |
| std::cout << "blurring neko img\n"; |
| for(auto& img : preprocessor::animeNekoGirls) |
| { |
| cv::GaussianBlur(img, img, cv::Size(kerx, kery), 0); |
| } |
|
|
| std::cout << "blurring non_neko img\n"; |
| for(auto& img : preprocessor::nonAnimeNekoGirls) |
| { |
| cv::GaussianBlur(img, img, cv::Size(kerx, kery), 0); |
| } |
| } |
| } |
|
|
| void preprocessor::detectEdgesImg(int algType, int thr1, int thr2) |
| { |
| if(algType == 0) |
| { |
| std::cout << "applying canny to neko img\n"; |
| for(auto& img : preprocessor::animeNekoGirls) |
| { |
| cv::Canny(img, img, thr1, thr2); |
| } |
|
|
| std::cout << "applying canny to non_neko img\n"; |
| for(auto& img : preprocessor::nonAnimeNekoGirls) |
| { |
| cv::Canny(img, img, thr1, thr2); |
| } |
| } |
| } |
|
|
| void preprocessor::detectContours() |
| { |
| std::vector<std::vector<cv::Point>> conts; |
|
|
| std::cout << "applying thresholding and finding contours in neko img\n"; |
| for(auto& img : preprocessor::animeNekoGirls) |
| { |
| cv::threshold(img, img, 125, 255, cv::THRESH_BINARY); |
| cv::findContours(img, conts, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); |
| for(size_t i = 0; i < conts.size(); i++) |
| { |
| cv::drawContours(img, {conts}, i, cv::Scalar(255,0,0), 2); |
| } |
| } |
|
|
| std::cout << "applying thresholding and finding contours in non-neko img\n"; |
| for(auto& img : preprocessor::nonAnimeNekoGirls) |
| { |
| cv::threshold(img, img, 80, 255, cv::THRESH_BINARY); |
| cv::findContours(img, conts, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); |
| for(size_t i = 0; i < conts.size(); i++) |
| { |
| cv::drawContours(img, {conts}, i, cv::Scalar(255,0,0), 2); |
| } |
| } |
| } |
|
|
| void preprocessor::harrisImg() |
| { |
| std::cout << "applying harris to neko img\n"; |
| for(auto& img : preprocessor::animeNekoGirls) |
| { |
| img.convertTo(img, CV_32F); |
| cv::cornerHarris(img, img, 2, 1, 0.1); |
| } |
|
|
| std::cout << "applying harris to non_neko img\n"; |
| for(auto& img : preprocessor::nonAnimeNekoGirls) |
| { |
| img.convertTo(img, CV_32F); |
| cv::cornerHarris(img, img, 2, 5, 0.03); |
| } |
| } |
|
|
| void preprocessor::SIFTimg() |
| { |
| cv::Ptr<cv::SIFT> SIFTdetector = cv::SIFT::create(); |
|
|
| for(auto& img : preprocessor::animeNekoGirls) |
| { |
| std::vector<cv::KeyPoint> kpoints; |
| SIFTdetector->detect(img, kpoints); |
| cv::Mat img_kpoints; |
| } |
| } |
|
|
| bool preprocessor::boolDetectHuman() |
| { |
| cv::HOGDescriptor hog; |
| hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); |
| cv::Mat img = cv::imread("/home/simtoon/img.jpg"); |
|
|
| std::vector<cv::Rect> ppl; |
| hog.detectMultiScale(img, ppl); |
|
|
| for (cv::Rect rect : ppl) |
| { |
| cv::rectangle(img, rect, cv::Scalar(0, 0, 255), 2); |
| } |
|
|
| if(ppl.empty()) |
| { |
| return false; |
| } |
| else |
| { |
| return true; |
| cv::imshow("humanzz", img); |
| cv::waitKey(); |
| } |
| return false; |
| } |
|
|
| void preprocessor::imwriteToDiskImg() |
| { |
| std::cout << "writing pre-processed neko img\n"; |
| for(size_t i = 0; i < preprocessor::animeNekoGirls.size(); i++) |
| { |
| |
| cv::imwrite("/home/simtoon/datasets/processed/neko/" + std::to_string(i) + ".jpeg", preprocessor::animeNekoGirls[i] ); |
| } |
|
|
| std::cout << "writing pre-processed non_neko img\n"; |
| for(size_t i = 0; i < preprocessor::nonAnimeNekoGirls.size(); i++) |
| { |
| |
| cv::imwrite("/home/simtoon/datasets/processed/non_neko/" + std::to_string(i) + ".jpeg", preprocessor::nonAnimeNekoGirls[i] ); |
| } |
| } |
|
|
|
|
| int main() |
| { |
| preprocessor Preprocessor; |
|
|
| Preprocessor.boolDetectHuman(); |
|
|
| Preprocessor.loadImg(); |
| Preprocessor.resizeImg(); |
| |
| std::cout << "Press any key to proceed to the next step"; |
| std::cin.ignore(); |
| Preprocessor.convertToGrayscaleImg(); |
| Preprocessor.imwriteToDiskImg(); |
| std::cout << "Press any key to proceed to the next step"; |
| std::cin.ignore(); |
| Preprocessor.blurImg(0, 5, 5); |
| Preprocessor.imwriteToDiskImg(); |
| std::cout << "Press any key to proceed to the next step"; |
| std::cin.ignore(); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| } |