summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--straighten-img.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/straighten-img.cpp b/straighten-img.cpp
new file mode 100644
index 0000000..102e8e5
--- /dev/null
+++ b/straighten-img.cpp
@@ -0,0 +1,83 @@
+/*
+straighten-img.cpp
+Draw a line on an image and the image rotates so that the line is horizontal
+
+Author: Nash
+Website: http://opencv-code.com/tutorials/straighten-up-an-image/
+
+Usage:
+1. Click to set the start point.
+2. Drag your mouse.
+3. Click to set the end point.
+4. The corrected image will be displayed.
+5. Click the original image again to restart.
+6. Press 'q' to quit.
+*/
+
+#include <opencv2/imgproc/imgproc.hpp>
+#include <opencv2/highgui/highgui.hpp>
+#include <cmath>
+#include <iostream>
+
+cv::Mat im0, im1;
+std::vector<cv::Point> pt;
+
+void straighten_image(std::vector<cv::Point> pt)
+{
+ double angle = std::atan((double)(pt[0].y - pt[1].y) /
+ (pt[0].x - pt[1].x)) *
+ (180 / CV_PI);
+
+ cv::Point2f center(im0.cols/2., im0.rows/2.);
+ cv::Mat dst, r = cv::getRotationMatrix2D(center, angle, 1.0);
+ cv::warpAffine(im0, dst, r, im0.size());
+ cv::imshow("dst", dst);
+ cv::imwrite("src.jpg", im1);
+ cv::imwrite("dst.jpg", dst);
+}
+
+void on_mouse(int event, int x, int y, int flags, void* param)
+{
+ if (event == CV_EVENT_LBUTTONDOWN)
+ {
+ switch (pt.size())
+ {
+ case 0:
+ pt.push_back(cv::Point(x,y));
+ break;
+ case 1:
+ pt.push_back(cv::Point(x,y));
+ straighten_image(pt);
+ break;
+ case 2:
+ im1 = im0.clone();
+ pt.clear();
+ break;
+ }
+ }
+ else if (event == CV_EVENT_MOUSEMOVE && pt.size() == 1)
+ {
+ im1 = im0.clone();
+ cv::line(im1, pt[0], cv::Point(x,y), CV_RGB(255,0,0), 2);
+ }
+
+ if (im1.data)
+ cv::imshow("src", im1);
+}
+
+int main()
+{
+ im0 = cv::imread("lena.png");
+ if (!im0.data)
+ {
+ std::cout << "Cannot load source image!" << std::endl;
+ return -1;
+ }
+
+ cv::namedWindow("src", CV_WINDOW_AUTOSIZE);
+ cv::setMouseCallback("src", on_mouse, 0);
+ cv::imshow("src", im0);
+ cv::waitKey();
+ return 0;
+}
+