Add current project. Compiles and runs on raspberry pi. Doesn't on ubuntu box (mismatch of opencv versions)
This commit is contained in:
commit
835d509da5
|
@ -0,0 +1,3 @@
|
||||||
|
build
|
||||||
|
bin
|
||||||
|
cmake-modules
|
|
@ -0,0 +1,17 @@
|
||||||
|
cmake_minimum_required(VERSION 3.1)
|
||||||
|
PROJECT (opencv_fb)
|
||||||
|
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules)
|
||||||
|
|
||||||
|
find_package(OpenCV HINTS /usr/local/opt/opencv /usr/local/Cellar/opencv REQUIRED)
|
||||||
|
|
||||||
|
set( NAME_SRC
|
||||||
|
opencv_fb.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/include )
|
||||||
|
link_directories( ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
add_executable( opencv_fb ${NAME_SRC} ${NAME_HEADERS} )
|
||||||
|
|
||||||
|
target_link_libraries( opencv_fb ${OpenCV_LIBS} )
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#mkdir -p bin
|
||||||
|
#g++ -o bin/opencv_fb -lopencv_core -lopencv_highgui -lopencv_imgproc opencv_fb.cpp
|
||||||
|
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake ..
|
||||||
|
make -j
|
|
@ -0,0 +1,120 @@
|
||||||
|
/**
|
||||||
|
* @file opencv_fb.cpp
|
||||||
|
* Displays OpenCV video on framebuffer.
|
||||||
|
* Compile with
|
||||||
|
* g++ -o fbwrite_video -lopencv_core -lopencv_highgui -lopencv_imgproc fbwrite_video.cpp
|
||||||
|
*
|
||||||
|
* Contains code from https://stackoverflow.com/questions/4722301/writing-to-frame-buffer
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream> // for cerr
|
||||||
|
#include <opencv2/imgproc/imgproc.hpp> // for cvtColor
|
||||||
|
#include <opencv2/highgui/highgui.hpp> // for VideoCapture
|
||||||
|
#include <fstream> // for ofstream
|
||||||
|
#include <boost/timer/timer.hpp> // for boost::timer::cpu_timer
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
// this is C :/
|
||||||
|
#include <stdint.h> // for uint32_t
|
||||||
|
#include <sys/ioctl.h> // for ioctl
|
||||||
|
#include <linux/fb.h> // for fb_
|
||||||
|
#include <fcntl.h> // for O_RDWR
|
||||||
|
|
||||||
|
struct framebuffer_info {
|
||||||
|
uint32_t bits_per_pixel;
|
||||||
|
uint32_t xres_virtual;
|
||||||
|
uint32_t yres_virtual;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct framebuffer_info get_framebuffer_info(const char* framebuffer_device_path) {
|
||||||
|
struct framebuffer_info info;
|
||||||
|
struct fb_var_screeninfo screen_info;
|
||||||
|
int fd = -1;
|
||||||
|
fd = open(framebuffer_device_path, O_RDWR);
|
||||||
|
if (fd >= 0) {
|
||||||
|
if (!ioctl(fd, FBIOGET_VSCREENINFO, &screen_info)) {
|
||||||
|
info.xres_virtual = screen_info.xres_virtual;
|
||||||
|
info.yres_virtual = screen_info.yres_virtual;
|
||||||
|
info.bits_per_pixel = screen_info.bits_per_pixel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return info;
|
||||||
|
};
|
||||||
|
// C ends here
|
||||||
|
|
||||||
|
void display (Mat frame, framebuffer_info fb_info, ofstream& ofs) {
|
||||||
|
if (frame.depth() != CV_8U) {
|
||||||
|
cerr << "Not 8 bits per pixel and channel." << endl;
|
||||||
|
} else if (frame.channels() != 3) {
|
||||||
|
cerr << "Not 3 channels." << endl;
|
||||||
|
} else {
|
||||||
|
// 3 Channels (assumed BGR), 8 Bit per Pixel and Channel
|
||||||
|
int framebuffer_width = fb_info.xres_virtual;
|
||||||
|
int framebuffer_depth = fb_info.bits_per_pixel;
|
||||||
|
Size2f frame_size = frame.size();
|
||||||
|
Mat framebuffer_compat;
|
||||||
|
switch (framebuffer_depth) {
|
||||||
|
case 16:
|
||||||
|
cvtColor(frame, framebuffer_compat, COLOR_BGR2BGR565);
|
||||||
|
for (int y = 0; y < frame_size.height ; y++) {
|
||||||
|
ofs.seekp(y*framebuffer_width*2);
|
||||||
|
ofs.write(reinterpret_cast<char*>(framebuffer_compat.ptr(y)),frame_size.width*2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 32: {
|
||||||
|
vector<Mat> split_bgr;
|
||||||
|
split(frame, split_bgr);
|
||||||
|
split_bgr.push_back(Mat(frame_size,CV_8UC1,Scalar(255)));
|
||||||
|
merge(split_bgr, framebuffer_compat);
|
||||||
|
for (int y = 0; y < frame_size.height ; y++) {
|
||||||
|
ofs.seekp(y*framebuffer_width*4);
|
||||||
|
ofs.write(reinterpret_cast<char*>(framebuffer_compat.ptr(y)),frame_size.width*4);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
cerr << "Unsupported depth of framebuffer." << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat frameEffects (Mat frame) {
|
||||||
|
Mat grey;
|
||||||
|
Mat contrast;
|
||||||
|
Mat blur;
|
||||||
|
Mat flipper;
|
||||||
|
//flip(frame, flipper, 1);
|
||||||
|
//cvtColor(flipper, grey, COLOR_BGR2GRAY);
|
||||||
|
//grey.convertTo(contrast, -1, 1, 0);
|
||||||
|
//cvtColor(contrast, frame, COLOR_GRAY2BGR);
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int, char**) {
|
||||||
|
const int frame_rate = 24;
|
||||||
|
int frameCount = 0;
|
||||||
|
framebuffer_info fb_info = get_framebuffer_info("/dev/fb0");
|
||||||
|
VideoCapture cap(0);
|
||||||
|
if(!cap.isOpened()) {
|
||||||
|
cerr << "Could not open video device." << endl;
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
cout << "Successfully opened video device." << endl;
|
||||||
|
cap.set(CAP_PROP_FRAME_WIDTH, 1280);
|
||||||
|
cap.set(CAP_PROP_FRAME_HEIGHT, 720);
|
||||||
|
cap.set(CAP_PROP_FPS, frame_rate);
|
||||||
|
//cap.set(CAP_PROP_BUFFERSIZE,3);
|
||||||
|
cout << cap.get(CAP_PROP_FRAME_WIDTH) << "x" << cap.get(CAP_PROP_FRAME_HEIGHT) << endl;
|
||||||
|
ofstream ofs("/dev/fb0");
|
||||||
|
Mat frame;
|
||||||
|
Mat displayFrame;
|
||||||
|
while (true) {
|
||||||
|
cap >> frame;
|
||||||
|
frame = frameEffects(frame);
|
||||||
|
resize(frame, displayFrame, Size(fb_info.xres_virtual, fb_info.yres_virtual), 2, 2, INTER_CUBIC);
|
||||||
|
display(displayFrame, fb_info, ofs);
|
||||||
|
waitKey(42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue