-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
69 lines (51 loc) · 2.17 KB
/
Copy pathmain.cpp
File metadata and controls
69 lines (51 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
const float SCALE_FACTOR = 0.2;
const int CHAR_WIDTH = 10;
const int CHAR_HEIGHT = 18;
struct tUser{
std::string inputFileName;
std::string outputFileName;
cv::Mat inputImage;
cv::Mat outputImage;
};
bool loadUser(int argc, char* argv[], tUser &user);
void imgToAscii(tUser &user);
int main(int argc, char* argv[]){
if(argc != 3){
std::cout << "Incorrect number of arguments\n";
return 1;
}
tUser user;
if(!loadUser(argc, argv, user)){
std::cout << "Could not read image: " << user.inputFileName << "\n";
return 1;
}
imgToAscii(user);
cv::imwrite(user.outputFileName, user.outputImage);
std::cout << "ASCII art saved to " << user.outputFileName << "\n";
return 0;
}
bool loadUser(int argc, char* argv[], tUser &user){
user.inputFileName = argv[1];
user.outputFileName = std::string(argv[2]) + ".png";
user.inputImage = cv::imread(user.inputFileName, cv::IMREAD_COLOR);
return !(user.inputImage.empty());
}
void imgToAscii(tUser &user){
cv::resize(user.inputImage, user.inputImage, cv::Size(static_cast<int>(SCALE_FACTOR * user.inputImage.cols), static_cast<int>(SCALE_FACTOR * user.inputImage.rows * (static_cast<float>(CHAR_WIDTH) / CHAR_HEIGHT))));
user.outputImage = cv::Mat(CHAR_HEIGHT * user.inputImage.rows, CHAR_WIDTH * user.inputImage.cols, user.inputImage.type());
for (int i = 0; i < user.inputImage.rows; i++) {
for (int j = 0; j < user.inputImage.cols; j++) {
cv::Vec3b pixel = user.inputImage.at<cv::Vec3b>(i, j);
int h = (pixel[0] + pixel[1] + pixel[2]) / 3;
uchar asciiChar = h * 1.0 / 256 * 16;
std::string asciiText(1, " .,:;i1tfLCG08$@"[asciiChar]);
user.outputImage(cv::Rect(j * CHAR_WIDTH, i * CHAR_HEIGHT, CHAR_WIDTH, CHAR_HEIGHT)) = cv::Scalar(25, 25, 25);
cv::putText(user.outputImage, asciiText, cv::Point(j * CHAR_WIDTH, i * CHAR_HEIGHT + CHAR_HEIGHT), cv::FONT_HERSHEY_SIMPLEX, 0.6, cv::Scalar(pixel[0], pixel[1], pixel[2]), 1);
}
}
}