|
@ -0,0 +1,164 @@ |
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <opencv2/core/core.hpp>
|
|
|
|
|
|
#include <opencv2/tracking.hpp>
|
|
|
|
|
|
#include <opencv2/highgui/highgui.hpp>
|
|
|
|
|
|
#include <opencv2/imgproc/imgproc.hpp>
|
|
|
|
|
|
#include <X11/Xlib.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using namespace cv; |
|
|
|
|
|
|
|
|
|
|
|
Rect2d getSelection(Mat img, char* title, bool fromCenter, bool showCrosshair){ |
|
|
|
|
|
Rect2d r = selectROI(title, img, fromCenter, showCrosshair); |
|
|
|
|
|
if(r.empty()){ |
|
|
|
|
|
std::cout << "Cancelled selection, exiting.\n"; |
|
|
|
|
|
exit(0); |
|
|
|
|
|
} |
|
|
|
|
|
return r; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Mat getImgFromFile(char* impath){ |
|
|
|
|
|
Mat img = imread(impath); |
|
|
|
|
|
if(img.empty()) |
|
|
|
|
|
{ |
|
|
|
|
|
std::cerr<< "Could not read image from: " << impath << std::endl; |
|
|
|
|
|
exit(1); |
|
|
|
|
|
} |
|
|
|
|
|
return img; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Mat getImgFromClipboard(){ |
|
|
|
|
|
// TODO implement a C++ implementation instead
|
|
|
|
|
|
system("xclip -o -selection clipboard > /tmp/from.png"); |
|
|
|
|
|
Mat img = imread("/tmp/from.png"); |
|
|
|
|
|
if(img.empty()) |
|
|
|
|
|
{ |
|
|
|
|
|
std::cerr<< "Could not read image from clipboard. "<< std::endl; |
|
|
|
|
|
exit(1); |
|
|
|
|
|
} |
|
|
|
|
|
return img; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void saveImgToClipboard(Mat img){ |
|
|
|
|
|
// TODO implement a C++ implementation instead
|
|
|
|
|
|
imwrite("/tmp/to.png", img); |
|
|
|
|
|
system("xclip -selection clipboard -target image/png -i /tmp/to.png"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void exitHelp(){ |
|
|
|
|
|
const char* HELP_TEXT = "Usage:\n" |
|
|
|
|
|
" simcrop [OPTION?] -f(c) [PATH?] -s(c) [PATH?]\n\n" |
|
|
|
|
|
"Help Options:\n" |
|
|
|
|
|
" -h, --help Show help options\n\n" |
|
|
|
|
|
"Application Options:\n" |
|
|
|
|
|
" -c, --center Select from center\n" |
|
|
|
|
|
" -x, --crosshair Show crosshair\n\n" |
|
|
|
|
|
"From & To:\n" |
|
|
|
|
|
" -f(c) [PATH] Image to crop, adding c fetches the image from clipboard\n" |
|
|
|
|
|
" -s(c) [PATH] Path to save cropped, adding c saves the image to clipboard\n\n" |
|
|
|
|
|
"Keybinds:\n" |
|
|
|
|
|
" * In selection, press enter or space to confirm.\n" |
|
|
|
|
|
" * To cancel, press c in selection window.\n" |
|
|
|
|
|
" * In confirmation, press q to exit and s to save.\n"; |
|
|
|
|
|
std::cout << HELP_TEXT << "\n"; |
|
|
|
|
|
exit(0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) |
|
|
|
|
|
{ |
|
|
|
|
|
bool showCrosshair = false; |
|
|
|
|
|
bool selectFromCenter = false; |
|
|
|
|
|
Mat fromImg = Mat(); |
|
|
|
|
|
bool saveClipboard = false; |
|
|
|
|
|
char* savePath = ""; |
|
|
|
|
|
char* title = "SimCrop"; |
|
|
|
|
|
|
|
|
|
|
|
if(argc < 3){ |
|
|
|
|
|
std::cout << "Not enough parameters!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < argc; ++i){ |
|
|
|
|
|
if(argv[i][0] != '-'){ |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
if(!strcmp(argv[i], "-h")){ |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
}else if(!(strcmp(argv[i], "-c") && strcmp(argv[i], "--center"))){ |
|
|
|
|
|
selectFromCenter = true; |
|
|
|
|
|
}else if(!(strcmp(argv[i], "-x") && strcmp(argv[i], "--crosshair"))){ |
|
|
|
|
|
showCrosshair = true; |
|
|
|
|
|
}else if(!(strcmp(argv[i], "-t") && strcmp(argv[i], "--title"))){ |
|
|
|
|
|
if(argc <= i+1){ |
|
|
|
|
|
std::cerr << "You must provide a string with -t!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
title = argv[i+1]; |
|
|
|
|
|
}else if(!strcmp(argv[i], "-f")){ |
|
|
|
|
|
if(!fromImg.empty()){ |
|
|
|
|
|
std::cerr << "You can only provide one from argument!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
if(argc <= i+1){ |
|
|
|
|
|
std::cerr << "You must provide a path with -f!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
fromImg = getImgFromFile(argv[i+1]); |
|
|
|
|
|
}else if(!strcmp(argv[i], "-s")){ |
|
|
|
|
|
if(strcmp(savePath, "") || saveClipboard){ |
|
|
|
|
|
std::cerr << "You can only provide one save argument!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
if(argc <= i+1){ |
|
|
|
|
|
std::cerr << "You must provide a path with -s!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
savePath = argv[i+1]; |
|
|
|
|
|
}else if(!strcmp(argv[i], "-fc")){ |
|
|
|
|
|
if(!fromImg.empty()){ |
|
|
|
|
|
std::cerr << "You can only provide one from arguement!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
fromImg = getImgFromClipboard(); |
|
|
|
|
|
}else if(!strcmp(argv[i], "-sc")){ |
|
|
|
|
|
if(strcmp(savePath, "") || saveClipboard){ |
|
|
|
|
|
std::cerr << "You can only provide one save argument!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
saveClipboard = true; |
|
|
|
|
|
}else{ |
|
|
|
|
|
std::cout << "Unknown parameter " << argv[i] << "\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("%d", fromImg.empty()); |
|
|
|
|
|
if(!(saveClipboard || strcmp(savePath, "")) || fromImg.empty()){ |
|
|
|
|
|
std::cerr << "From and To arguements are mandatory!\n"; |
|
|
|
|
|
exitHelp(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uint8_t key = 98; |
|
|
|
|
|
Mat cropped = Mat(); |
|
|
|
|
|
Rect2d selection = Rect2d(); |
|
|
|
|
|
while(key == 98){ |
|
|
|
|
|
selection = getSelection(fromImg, title, selectFromCenter, showCrosshair); |
|
|
|
|
|
cropped = fromImg(selection); |
|
|
|
|
|
imshow(title, cropped); |
|
|
|
|
|
do{ |
|
|
|
|
|
key = waitKey(1); |
|
|
|
|
|
}while(key != 113 && key != 115 && key != 98); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(key == 113){ |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(saveClipboard){ |
|
|
|
|
|
saveImgToClipboard(cropped); |
|
|
|
|
|
}else{ |
|
|
|
|
|
imwrite(savePath, cropped); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
} |