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
MorphologyFilter
Gallery
src 元画像
dst 処理画像 (×4, grayscale, MorphologyFilter)
what process?
CUDAを使ったモルフォロジー変換。 元画像の4倍にし、グレースケールにした後で処理をかけています。 データセットは、"The PASCAL Visual Object Classes Challenge 2007"(VOC2007)で使われている訓練データとテストデータを合わせた9963枚の画像とした。 実行環境PCは下記の通りです。(そこまで新しくない) ・CPU AMD Ryzan 5 1400 ・GPU NVIDIA GeForce GTX960 (CUDAコア数:1024、GPUメモリ:2GB) ・マザーボード MSI B450 GAMING PLUS MAX B450 ・メモリ DDR4 8G * 4枚 CPU と GPU でそれぞれ処理させて時間を計測してみた。 ・CPU 66.938355[sec] ・GPU 199.361903[sec] CPUの方がGPUより3倍速い結果となりました。 注意点: cv::morphologyExでは入力画像はどのチャネル数であっても問題ないですが、cv::cuda::createMorphologyFilterではchannel1 or 4のみ(GRAY or BGRA)可能です。
cook code C++
//STANDARD #include <iostream> //OPENCV #include <opencv2/core.hpp> #include <opencv2/core/utility.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/core/cuda.hpp> #include <opencv2/cudawarping.hpp> #include <opencv2/cudafilters.hpp> #include <opencv2/cudaimgproc.hpp> //BOOST #include <boost/timer/timer.hpp> #include <boost/filesystem.hpp> #include <boost/foreach.hpp> namespace fs = boost::filesystem; const int __MAG__ = 4; cv::Mat cpu_process(std::string path){ cv::Mat mat = cv::imread(path); cv::Mat bigMat; cv::Mat gray; cv::Mat dst; cv::resize(mat, bigMat, cv::Size(), __MAG__, __MAG__); cv::cvtColor(bigMat, gray, cv::COLOR_BGR2GRAY); cv::morphologyEx(gray, dst, cv::MORPH_GRADIENT, kernel, cv::Point(-1,-1), 3); mat.release(); bigMat.release(); return dst; } cv::Mat gpu_process(std::string path){ cv::Mat mat = cv::imread(path), dst; cv::cuda::GpuMat gpu_src, gpu_bigmat, gpu_gray, gpu_dst; gpu_src.upload(mat); cv::cuda::resize(gpu_src, gpu_bigmat, cv::Size(), __MAG__, __MAG__); cv::cuda::cvtColor(gpu_bigmat, gpu_gray, cv::COLOR_BGR2GRAY); cv::Ptr<cv::cuda::Filter> obj = cv::cuda::createMorphologyFilter( cv::MORPH_GRADIENT, gpu_gray.type(), kernel, cv::Point(-1,-1), 3); obj->apply(gpu_gray, gpu_dst); gpu_dst.download(dst); gpu_dst.release(); gpu_gray.release(); gpu_bigmat.release(); gpu_src.release(); mat.release(); return dst; } int main(int argc, const char* argv[]){ cv::String keys = "{gpu||}"; cv::CommandLineParser parser(argc, argv, keys); bool is_gpu = parser.get<bool>("gpu"); boost::timer::cpu_timer timer; // 時間計測を開始 fs::path dir("../dataset/VOCdevkit/VOC2007/JPEGImages"); cv::Mat outMat; int i = 0; BOOST_FOREACH(const fs::path& p, std::make_pair(fs::directory_iterator(dir), fs::directory_iterator())) { if (!fs::is_directory(p)){ std::string parent_path = p.parent_path().c_str(); std::string slash = "/"; std::string filename = p.filename().c_str(); std::string full_path = parent_path + slash + filename; std::cout << full_path << std::endl; if(is_gpu){ outMat = gpu_process(full_path); }else{ outMat = cpu_process(full_path); } } i++; } std::string result = timer.format(); // 結果文字列を取得する std::cout << result << std::endl; cv::imwrite("output.png", outMat); return 0; }
cook code Python
# 非対応
Reference
https://proc-cpuinfo.fixstars.com/2016/08/gpumat-html/
https://qiita.com/dandelion1124/items/9766a854b9085217fea5
The PASCAL Visual Object Classes Challenge 2007
https://qiita.com/satsukiya/items/90dffb6c70cf6fa9d0fe