60 lines
1.6 KiB
C++

#include <random>
#include <vector>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <opencv2/opencv.hpp>
#define FIFO_NAME "cvMat"
// const std::vector<std::string> imageFiles = {"bus.jpg", "cat_dog.jpg", "girl_faces.png"};
const std::vector<std::string> imageFiles = {"bus.jpg"};
cv::Mat getFrame(const std::string source);
std::string getRandomImage(std::vector<std::string> images);
int main(int argc, char const *argv[]) {
if (!mkfifo(FIFO_NAME, 0666)) {
std::perror("open");
return EXIT_FAILURE;
}
cv::Mat frame = getFrame(getRandomImage(imageFiles));
cv::Mat flat = frame.reshape(1, frame.total() * frame.channels());
std::vector<uchar> buffer = frame.isContinuous() ? flat : flat.clone();
int fd = open(FIFO_NAME, O_WRONLY);
write(fd, buffer.data(), buffer.size());
printf("Sended: %d\n", buffer.size());
close(fd);
cv::Mat my_mat = cv::Mat(frame.rows, frame.cols, frame.type(), buffer.data());
cv::imwrite("sended.png", my_mat);
return EXIT_SUCCESS;
}
cv::Mat getFrame(const std::string source) {
cv::Mat image = cv::imread(source, cv::IMREAD_COLOR);
if (image.empty()) {
std::perror("failed to load image");
const cv::Mat emptyFrame(480, 640, CV_8UC3, cv::Scalar(44, 44, 44));
return emptyFrame;
} else {
return image;
}
}
std::string getRandomImage(std::vector<std::string> images) {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, images.size() - 1);
int randomIndex = dis(gen);
std::string randomString = images[randomIndex];
return randomString;
}