60 lines
1.6 KiB
C++
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;
|
|
}
|