Menu
Menu
Home
Trend
Network
Bazuri Time
OpenCV Documentation
Reference
openCV doc
Module(main)
objdetect
QRcode
猫認識
photo
Pencil Sketch
水彩画エフェクト(Water Color)
video
オプティカルフロー(calcOpticalFlowFarneback)
オプティカルフロー(calcOpticalFlowPyrLK)
オプティカルフロー(Practical:オーラグラフィー)
オプティカルフロー(Practical:グリッチ)
features2d
特徴点描画(単一画像)
Module(contrib)
dpm
Deformable Part Model
freetype
日本語テキスト
intensity_transform
輝度値補正
ximgproc
高速輪郭抽出
AnisotropicDiffusion
輪郭保管するノイズフィルタ(Reich-Wörgötter)
陰影を考慮した二値化処理
Pei-Lin Normalization
細線化
グラフ構造を考慮した領域分割
EdgeBoxes
xphoto
OilPaint
Gray World White Balance
Simple White Balance
Module(cuda)
cudafilters
LaplacianFilter
GaussianFilter
SobelFilter
ScharrFilter
MorphologyFilter
cudaimgproc
bilateralFilter
Canny
HoughLine
HoughCircle
CornerHarris
CornerMinEigenVal
オプティカルフロー(Practical:グリッチ)
Gallery
src
dst
what process?
密なオプティカルフロー(dense optical flow)を使ってエフェクトを生成しました。 フレーム間の移動量ベクトルをもとに座標変換しています。 グリッチ(glitch)は海外のゲーム業界ではバグと同義で扱われていて、一時的に画面表示エラーになることも意味します。
cook code C++
#include <iostream> #include <opencv2/core.hpp> #include <opencv2/core/utility.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/videoio.hpp> #include <opencv2/video.hpp> cv::Mat warp_flow(cv::Mat img, cv::Mat flow){ int height = flow.rows; int width = flow.cols; cv::Mat opti_flow(height, width, CV_32FC2), dst; for(int w = 0; w < width; w++){ for(int h = 0; h < height; h++){ const cv::Point2f& src_xy = flow.at<cv::Point2f>(h, w); cv::Point2f& opti_xy = opti_flow.at<cv::Point2f>(h, w); opti_xy.x = w + src_xy.x; opti_xy.y = h + src_xy.y; } } cv::remap(img, dst, opti_flow, cv::Mat(), cv::INTER_LINEAR); return dst; } int main(int argc, const char* argv[]) { // ./out -src=[image path] cv::String keys = "{src||}"; cv::CommandLineParser parser(argc, argv, keys); cv::String src_path = parser.get<cv::String>("src"); cv::VideoCapture capture(src_path); if (!capture.isOpened()){ //error in opening the video input std::cerr << "Unable to open file!" << std::endl; return 0; } /* 初期設定 */ int cap_width = int(capture.get(cv::CAP_PROP_FRAME_WIDTH)); int cap_height = int(capture.get(cv::CAP_PROP_FRAME_HEIGHT)); int fps = int(capture.get(cv::CAP_PROP_FPS)); int fourcc = cv::VideoWriter::fourcc('m','p','4','v'); cv::Size video_size = cv::Size(cap_width,cap_height); cv::VideoWriter writer("output.mp4", fourcc, fps, video_size); cv::Mat old_frame, old_gray; capture >> old_frame; cv::cvtColor(old_frame, old_gray, cv::COLOR_BGR2GRAY); while(true){ cv::Mat frame, frame_gray; capture >> frame; if (frame.empty()) break; cv::cvtColor(frame, frame_gray, cv::COLOR_BGR2GRAY); cv::Mat flow(old_gray.size(), CV_32FC2); cv::calcOpticalFlowFarneback(old_gray, frame_gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0); writer << warp_flow(frame, flow); old_gray = frame_gray.clone(); } capture.release(); writer.release(); return 0; }
cook code Python
import numpy as np import cv2 import argparse def warp_flow(img, flow): h, w = flow.shape[:2] flow[:,:,0] += np.arange(w) flow[:,:,1] += np.arange(h)[:,np.newaxis] res = cv2.remap(img, flow, None, cv2.INTER_LINEAR) return res def main(): parser = argparse.ArgumentParser() parser.add_argument('--src') args = parser.parse_args() cap = cv2.VideoCapture(args.src) cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') writer = cv2.VideoWriter('output.mp4', fmt, fps, (cap_width,cap_height)) _ret, prev = cap.read() prevgray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY) frame = prev.copy() while cap.isOpened(): _ret, img = cap.read() if img is None: break gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) flow = cv2.calcOpticalFlowFarneback(prevgray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0) prevgray = gray frame = warp_flow(frame, flow) writer.write(frame) frame = img.copy() cap.release() writer.release() if __name__ == '__main__': main()
Reference
https://github.com/opencv/opencv/blob/4.4.0/samples/python/opt_flow.py
https://heapsmag.com/urban-english-glitch-computer-trouble-broken-issue-bug
GIFMAGAZINE - タイガーステップ
Book : 詳細 OpenCV3 17章 トラッキング pp565-570