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
CornerMinEigenVal
Gallery
src 元画像
dst 処理画像 (grayscale, cornerMinEigenVal, normalize)
what process?
CUDAを使ったShiTomasiのコーナー検出。 グレースケールにした後で処理をかけています。 データセットは、"The PASCAL Visual Object Classes Challenge 2007"(VOC2007)で使われている訓練データとテストデータを合わせた9963枚の画像とした。 実行環境PCは下記の通りです。(そこまで新しくない) ・CPU AMD Ryzan 5 1400 ・GPU NVIDIA GeForce GTX960 (CUDAコア数:1024、GPUメモリ:2GB) ・マザーボード ASUS PRIME B450M-A ・メモリ DDR4 8G * 3枚 CPU と GPU でそれぞれ処理させて時間を計測してみた。 ・CPU 53.074278[sec] ・GPU 47.270670[sec] GPUの方が若干早い。 てか、Harrisによるコーナー検出よりも2倍はやい。
cook code C++
//STANDARD #include <iostream> #include <algorithm> //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/cudaimgproc.hpp> #include <opencv2/cudafilters.hpp> #include <opencv2/cudaarithm.hpp> //BOOST #include <boost/timer/timer.hpp> #include <boost/filesystem.hpp> #include <boost/foreach.hpp> namespace fs = boost::filesystem; int thresh = 128; cv::Mat cpu_process(std::string path){ cv::Mat mat = cv::imread(path); cv::Mat gray; cv::Mat corners = cv::Mat::zeros(mat.size(), CV_32FC1); cv::Mat corners_norm; cv::Mat dst = mat.clone(); cv::cvtColor(mat, gray, cv::COLOR_BGR2GRAY); cv::cornerMinEigenVal(gray, corners, 2, 3); cv::normalize(corners, corners_norm, 0, 255, cv::NORM_MINMAX, CV_32FC1, cv::Mat() ); for( int i = 0; i < corners_norm.rows ; i++ ){ for( int j = 0; j < corners_norm.cols; j++ ){ if( (int) corners_norm.at<float>(i,j) > thresh ){ cv::circle( dst, cv::Point(j,i), 2, cv::Scalar(0,0, 255), -1, cv::LINE_AA); } } } mat.release(); gray.release(); corners.release(); corners_norm.release(); return dst; } cv::Mat gpu_process(std::string path){ cv::Mat mat = cv::imread(path), corners_norm; cv::Mat dst = mat.clone(); cv::cuda::GpuMat gpu_src, gpu_gray, gpu_corners, gpu_corners_norm; dst = mat.clone(); gpu_src.upload(mat); cv::cuda::cvtColor(gpu_src, gpu_gray, cv::COLOR_BGR2GRAY); cv::Ptr<cv::cuda::CornernessCriteria> obj = cv::cuda::createMinEigenValCorner(gpu_gray.type(), 2, 3); obj->compute(gpu_gray, gpu_corners); cv::cuda::normalize(gpu_corners, gpu_corners_norm, 0, 255, cv::NORM_MINMAX, CV_32FC1); gpu_corners_norm.download(corners_norm); for( int i = 0; i < corners_norm.rows ; i++ ){ for( int j = 0; j < corners_norm.cols; j++ ){ if( (int) corners_norm.at<float>(i,j) > thresh ){ cv::circle( dst, cv::Point(j,i), 2, cv::Scalar(0, 0, 255), -1, cv::LINE_AA); } } } gpu_corners_norm.release(); gpu_corners.release(); gpu_gray.release(); gpu_src.release(); corners_norm.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, dstMat; 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); } } } std::string result = timer.format(); // 結果文字列を取得する std::cout << result << std::endl; cv::imwrite("output.png", dstMat); return 0; }
cook code Python
# 非対応
Reference
https://docs.opencv.org/4.5.0/d4/d7d/tutorial_harris_detector.html
https://pjreddie.com/projects/pascal-voc-dataset-mirror/
https://qiita.com/satsukiya/items/90dffb6c70cf6fa9d0fe