]> Git Repo - pov-display-rpi.git/blob - src/test.cpp
first commit
[pov-display-rpi.git] / src / test.cpp
1 #include "opencv2/opencv.hpp"
2 #include <iostream>
3 #include <cmath>
4
5 #define rings 72
6 #define deg 360*2
7 #define fits true
8 using namespace std;
9 using namespace cv;
10
11 cv::Mat fit(const cv::Mat &img) {
12         cv::Mat out;
13         int width = img.cols;
14         int height = img.rows;
15         double size, width_small, height_small;
16         if (width >= height) {
17                 size = width_small = (rings * 2) / sqrt(2);
18                 height_small = width_small * ((double) height / (double) width);
19         } else {
20                 size = height_small = (rings * 2) / sqrt(2);
21                 width_small = height * (width / (double) height);
22         }
23         resize(img, out, Size((int) width_small, (int) height_small));
24         int top = (size - height_small) / 2;
25         int down = (size - height_small + 1) / 2;
26         int left = (size - width_small) / 2;
27         int right = (size - width_small + 1) / 2;
28         cv::copyMakeBorder(out, out, top, down, left, right, cv::BORDER_CONSTANT,
29                         cv::Scalar(0, 0, 0));
30         return out;
31 }
32 cv::Mat crop(const cv::Mat &img) {
33         cv::Mat out;
34         int width = img.cols;
35         int height = img.rows;
36         cv::Rect crop;
37         if (width >= height) {
38                 resize(img, out,
39                                 Size(((double) rings * 2 * width) / (double) height,
40                                                 rings * 2));
41                 int mid = (out.cols - (rings * 2)) / 2;
42                 crop = cv::Rect(mid, 0, rings * 2, rings * 2);
43         } else {
44                 resize(img, out,
45                                 Size(rings * 2,
46                                                 ((double) rings * 2 * height) / (double) width));
47                 int mid = (out.rows - (rings * 2)) / 2;
48                 crop = cv::Rect(0, mid, rings * 2, rings * 2);
49         }
50         return out(crop);
51 }
52 double to_rad(double degree) {
53         double pi = 3.14159265359;
54         return (degree * (pi / 180));
55 }
56 int main(int argc, char **argv) {
57         VideoCapture cap(argv[1]);
58
59         if (!cap.isOpened()) {
60                 cout << "Error opening video stream or file" << endl;
61                 return -1;
62         }
63
64         while (1) {
65
66                 Mat frame;
67                 cap >> frame;
68                 if (frame.empty())
69                         break;
70                 if (fits)
71                         frame = crop(frame);
72                 else
73                         frame = fit(frame);
74
75                 Mat image = Mat(rings * 2, rings * 2, frame.type(), double(0));
76
77                 Vec3b buffer[deg][rings] = { 0 };
78                 for (int d = 0; d < deg; d++) {
79                         for (int radius = 0; radius < rings; radius++) {
80                                 int y = -(int) round(
81                                                 cos(to_rad((double) d / (deg / 360))) * radius);
82                                 int x = (int) round(
83                                                 sin(to_rad((double) d / (deg / 360))) * radius);
84                                 if (abs(x) >= frame.cols / 2 || abs(y) >= frame.rows / 2)
85                                         buffer[d][radius] = 0;
86                                 else
87                                         buffer[d][radius] = frame.at < Vec3b
88                                                         > (x + frame.cols / 2, y + frame.rows / 2);
89                         }
90                 }
91                 for (int d = 0; d < deg; d++) {
92                         for (int radius = 0; radius < rings; radius++) {
93                                 int y = (int) round(
94                                                 sin(to_rad((double) d / (deg / 360))) * radius);
95                                 int x = -(int) round(
96                                                 cos(to_rad((double) d / (deg / 360))) * radius);
97                                 image.at < Vec3b
98                                                 > (Point(x + image.cols / 2, y + image.rows / 2)) =
99                                                 buffer[d][radius];
100                         }
101                 }
102                 for (int d = 0; d < deg; d++) {
103                         int y = (int) round(sin(to_rad((double) d / (deg / 360))) * rings);
104                         int x = -(int) round(cos(to_rad((double) d / (deg / 360))) * rings);
105                         image.at < Vec3b > (Point(x + image.cols / 2, y + image.rows / 2)) =
106                                         Vec3b(255, 255, 255);
107                 }
108
109                 resize(image, image, Size(), 500 / (rings * 2), 500 / (rings * 2));
110                 imshow("Frame", image);
111
112                 char c = (char) waitKey(25);
113                 if (c == 27)
114                         break;
115         }
116
117         cap.release();
118         destroyAllWindows();
119
120         return 0;
121 }
This page took 0.030941 seconds and 4 git commands to generate.