Repository for OpenCV's extra modules
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

73 lines
1.8 KiB

#include <opencv2/v4d/v4d.hpp>
#ifndef __EMSCRIPTEN__
# include <opencv2/imgcodecs.hpp>
#endif
int main() {
using namespace cv;
using namespace cv::viz;
string hr = "Hello Rainbow!";
Ptr<V4D> v4d = V4D::make(Size(1280, 720), "Custom Source/Sink");
v4d->setVisible(true);
//Make a Source that generates rainbow frames.
Source src([=](cv::UMat& frame){
static long cnt = 0;
if(frame.empty())
frame.create(v4d->getFrameBufferSize(), CV_8UC3);
frame = colorConvert(Scalar(cnt % 180, 128, 128, 255), COLOR_HLS2BGR);
++cnt;
if(cnt > std::numeric_limits<long>().max() / 2.0)
cnt = 0;
return true;
}, 60.0f);
//Make a Sink the saves each frame to a PNG file.
Sink sink([](const cv::UMat& frame){
static long cnt = 0;
try {
#ifndef __EMSCRIPTEN__
imwrite(std::to_string(cnt) + ".png", frame);
#else
CV_UNUSED(frame);
#endif
} catch(std::exception& ex) {
cerr << "Unable to write frame: " << ex.what() << endl;
return false;
}
++cnt;
if(cnt > std::numeric_limits<long>().max() / 2.0) {
cnt = 0;
}
return true;
});
//Attach source and sink
v4d->setSource(src);
v4d->setSink(sink);
v4d->run([=]() {
//Capture video from the Source
if(!v4d->capture())
return false; //end of input video
//Render "Hello Rainbow!" over the frame
v4d->nvg([=](const Size& sz) {
using namespace cv::viz::nvg;
fontSize(40.0f);
fontFace("sans-bold");
fillColor(Scalar(255, 0, 0, 255));
textAlign(NVG_ALIGN_CENTER | NVG_ALIGN_TOP);
text(sz.width / 2.0, sz.height / 2.0, hr.c_str(), hr.c_str() + hr.size());
});
v4d->write(); //Write video to the Sink
return v4d->display(); //Display the framebuffer in the native window
});
}