Send cv::Mat with FIFO
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user