|
|
- #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;
- }
|