2019年12月7日土曜日

opencvについて

関数C++があるのでやはり一からの作業ですね。
モザイク処理やドローンのmapping softを色々探していますが、leptonの荒い画像で2Dのマッピングソフトは売ってなさそう。高解像度の画像だと3Dにもしてくれる。
https://qiita.com/ChaoticActivity/items/68f10d7452680fa1d52d
double,floatの指定ルールを確認しないとハマってしまいそうです。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

#define ROI_MARGIN_X1 (0.2*v_w)
#define ROI_MARGIN_X1_X2 (0.2*v_w)
#define ROI_MARGIN_Y (0.2*v_h)
#define ROI_SIZE_X ((v_w-ROI_MARGIN_X1*2-ROI_MARGIN_X1_X2)/2)
#define ROI_SIZE_Y (v_h-ROI_MARGIN_Y*2)
#define ROI_MARGIN_X2 (ROI_MARGIN_X1+ROI_SIZE_X+ROI_MARGIN_X1_X2)

#define map_offset_x 1500
#define map_offset_y 3000

double r(double x1,double y1,double x2,double y2){
    return pow((pow((x1-x2),2)+pow((y1-y2),2)),0.5);
}

int main()
{
    VideoCapture cap("a.mp4"); //同じDirectoryにfileがない場合("../Downloads/a.mp4");
    int v_w=cap.get(CV_CAP_PROP_FRAME_WIDTH);
    int v_h=cap.get(CV_CAP_PROP_FRAME_HEIGHT);
    Mat img;
    Mat result_img1;
    Mat result_img2;
    Mat resize_img;
    int d_x=0;
    int d_y=0;
    int position_x=0;
    int position_y=0;
    double angle=0; //右回りが正
    Mat map_img = Mat::zeros(3800, 3000, CV_8UC3);
    Mat dst_img= Mat(r(v_h,v_w,0,0),r(v_h,v_w,0,0), CV_8UC3);
    Rect dst_ROI(r(v_h,v_w,0,0)/2-v_w/2, r(v_h,v_w,0,0)/2-v_h/2, v_w, v_h);
    Mat element = Mat::ones(3,3,CV_8UC1);
 
    //初回でのテンプレートマッチング用のROIを作成
    cap>>img ;
    Mat last_roi_img1(img,Rect(ROI_MARGIN_X1,ROI_MARGIN_Y,ROI_SIZE_X,ROI_SIZE_Y));
    Mat last_roi_img2(img,Rect(ROI_MARGIN_X2,ROI_MARGIN_Y,ROI_SIZE_X,ROI_SIZE_Y));
 
    int max_frame=cap.get(CV_CAP_PROP_FRAME_COUNT);
    for(int i=1; i<max_frame;i++){ cap>>img;
     
        //テンプレートマッチング1----------------------------------------------
        matchTemplate(img,last_roi_img1,result_img1, CV_TM_CCOEFF_NORMED);
        Point max_pt1;
        double maxVal1;
        minMaxLoc(result_img1, NULL, &maxVal1, NULL, &max_pt1);
        //1つ目ここまで-----------------------------------------------------
     
        //テンプレートマッチング2----------------------------------------------
        matchTemplate(img,last_roi_img2,result_img2, CV_TM_CCOEFF_NORMED);
        Point max_pt2;
        double maxVal2;
        minMaxLoc(result_img2, NULL, &maxVal2, NULL, &max_pt2);
        //2つ目ここまで-----------------------------------------------------
     
        //次フレームでのテンプレートマッチング用のROIを保存1
        Mat roi_img1(img,Rect(ROI_MARGIN_X1,ROI_MARGIN_Y,ROI_SIZE_X,ROI_SIZE_Y));
        last_roi_img1=roi_img1.clone();
        //次フレームでのテンプレートマッチング用のROIを保存2
        Mat roi_img2(img,Rect(ROI_MARGIN_X2,ROI_MARGIN_Y,ROI_SIZE_X,ROI_SIZE_Y));
        last_roi_img2=roi_img2.clone();
     
        angle-=atan((double)(max_pt1.y-max_pt2.y)/(max_pt1.x-max_pt2.x));
     
        //位置推定
        d_x=(ROI_MARGIN_X1-max_pt1.x)/2+(ROI_MARGIN_X2-max_pt2.x)/2;
        d_y=(ROI_MARGIN_Y-max_pt1.y);
        position_x+=d_x*cos(angle)-d_y*sin(angle);
        position_y+=d_x*sin(angle)+d_y*cos(angle);
     
        cout <<i<<" / " <<max_frame<<" (" << position_x << ", " << position_y << ") angle = "<<angle<<endl;
     
        //ここからパノラマ作成
        Mat rot_dst_img(dst_img,dst_ROI);
        img.copyTo(rot_dst_img);
     
        // 回転:  [deg] と スケーリング: 1.0 [倍]
        float angle_d = -angle*180.0/3.141592, scale = 1.0;
        // 中心:画像中心
        cv::Point2f center(dst_img.cols*0.5, dst_img.rows*0.5);
        // 2次元の回転行列を計算
        const cv::Mat affine_matrix = cv::getRotationMatrix2D( center, angle_d, scale );
        warpAffine(dst_img, rot_dst_img, affine_matrix, dst_img.size());
     
        Mat map_roi_img(map_img,Rect(position_x+map_offset_x-dst_img.cols/2,position_y+map_offset_y-dst_img.rows/2,dst_img.cols,dst_img.rows));
        Mat mask=rot_dst_img.clone();
        cvtColor(mask,mask,CV_BGR2GRAY);
        threshold(mask,mask,1,255,THRESH_BINARY);
        erode(mask,mask, element, Point(-1,-1), 1);
        rot_dst_img.copyTo(map_roi_img,mask);
        resize(map_img, resize_img, cv::Size() ,0.2,0.2);
        //imshow("Map", map_img);
        imshow("Map", resize_img); //画面が大きいのでリサイズ
     
        waitKey(1);
    }
    imwrite("map.png", map_img);
    //imshow("Map", map_img);
    imshow("Map", resize_img);
    waitKey(0);
    return 0;
}

OpenCV が少し動かせる様になったのでmacにインストールしようとしてまたハマる。。。
マルチプラットフォームなのでubuntu, windows, Macにインストールできるはずで簡単にインストールできると思ったら大間違い。今回opencvもバージョンで色々違うのを思い知らされた。opencv2から3も違うのは先週までで思い知らされたのにmacでbrewで簡単にインストール出来ると勘違い。
wiwaoMacBookAir:~ wiwao$ brew install opencv
で関連するものをインストール
==> Installing dependencies for opencv: cmake, eigen, gflags, glog, metis, gmp, isl, mpfr, libmpc, gcc, openblas, suite-sparse, ceres-solver, aom, libpng, freetype, fontconfig, frei0r, gettext, libunistring, libidn2, libtasn1, nettle, libffi, p11-kit, libevent, unbound, gnutls, fribidi, pcre, python, glib, lzo, pixman, cairo, graphite2, icu4c, harfbuzz, libass, libbluray, libsoxr, libvidstab, libogg, libvpx, opencore-amr, jpeg, libtiff, little-cms2, openjpeg, opus, rtmpdump, flac, libsndfile, libsamplerate, rubberband, sdl2, speex, giflib, webp, leptonica, tesseract, x264, x265, xvid, ffmpeg, numpy, ilmbase, openexr and tbb
その後OpenCVをインストール
バージョンは4.1.2
そもそもコンパイルが出来ず。
error: #error "OpenCV 4.x+ requires enabled C++11 support"
 #  error "OpenCV 4.x+ requires enabled C++11 support"
brewでインストールしているのにc++11でないとエラーってどうなの?
そこもインストールをしてくれないの?
でbrew uninstall opencvで一度取り除いてopencv3をインストールし直し。
その操作も注意深くしないと。。。
opencv@3 ?
インストールパッケージをopencvとだけするとその時点でインストール可能な最新版がインストールされます.記事執筆時点では,4.1.0でした.
$ brew list --versions | grep opencv
opencv 4.1.0_1

他のバージョンが欲しい場合

OpenCV2やOpenCV3が必要な場合は,
$ brew install opencv@2
$ brew install opencv@3
でbrew install opencv@3
ワーングが。。。そういえばパスをbashrcに書き込んだのがopencv4のままなので一旦消去してecho 'export PATH="/usr/local/opt/opencv@3/bin:$PATH"' >> ~/.bash_profile
を書き込んだけどなんか違う感じ。最初は気づかなかったけど。

OpenCVを使ったC++コードをコンパイルする(CMake, GCC, pkg-config)



でパッケージのパスを通さないと行けないのに/usr/local/opt/opencv@3/bin:$PATHなんでbin ?
export PKG_CONFIG_PATH="/usr/local/opt/opencv@3/lib/pkgconfig"
にしないと行けないのに気がついた。
For compilers to find opencv@3 you may need to set:
  export LDFLAGS="-L/usr/local/opt/opencv@3/lib"
  export CPPFLAGS="-I/usr/local/opt/opencv@3/include"

For pkg-config to find opencv@3 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/opencv@3/lib/pkgconfig"
は一応書き込んだ。
でもさっきはopencv4.1.2で場所のときは、
OpenCVインストール時に/usr/local/lib/pkgconfigopencv4.pcというファイルが作成されているのでこれをPKG_CONFIG_PATHに与えます。
以下のコマンドを実行してください。
とある。
と言う事は今回は上記の様に/usr/local/opt/opencv@3/lib/pkgconfigになるはず。
:warning: 注意: exportで値を追加した環境変数はターミナルを閉じるまでは値を保持し続けます。
逆に言えば、ターミナルを開くたびに上記のexport (以下省略)を実行しなければいけません。
echo export PKG_CONFIG_PATH==/usr/local/opt/opencv@3/lib/pkgconfig >> ~/.bashrc
にしないとターミナルを閉じると毎回exportしないと行けないの、今回これで少し勉強になった。
echo export PKG_CONFIG_PATH==/usr/local/opt/opencv@3/lib/pkgconfig >> ~/.bashrc
nano ~/.bashrc
一番下の行にexport PKG_CONFIG_PATH==/usr/local/opt/opencv@3/lib/pkgconfigをコピペして保存すれば、次回からUbuntu(Mac)を起動するときに自動で実行されます。
nano ~/.bashrcでも確認出来ました。
意外とnano の操作で焦った。でexitするのはcontrolボタンとXキーでその後。

この画面でどのキーで抜け出すか分からない以外とリターンキーだけ。escキーでも良いのか?
2017071104

Warning: opencv@3 dependency gcc was built with a different C++ standard
library (libstdc++ from clang). This may cause problems at runtime.
==> Caveats
opencv@3 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have opencv@3 first in your PATH run:
  echo 'export PATH="/usr/local/opt/opencv@3/bin:$PATH"' >> ~/.bash_profile

For compilers to find opencv@3 you may need to set:
  export LDFLAGS="-L/usr/local/opt/opencv@3/lib"
  export CPPFLAGS="-I/usr/local/opt/opencv@3/include"

For pkg-config to find opencv@3 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/opencv@3/lib/pkgconfig"

==> Summary
🍺  /usr/local/Cellar/opencv@3/3.4.5_6: 656 files, 235.5MB
wiwaoMacBookAir:~ wiwao$ c++ $(pkg-config --cflags --libs opencv4) imshow.cpp
Package opencv4 was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv4.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv4' found
clang: error: no such file or directory: 'imshow.cpp'
clang: error: no input files

wiwaoMacBookAir:~ wiwao$ nano ~/.bashrc

でここまではなんとか出来たと思うのですが、コンパイルが通りません。。。
ここの簡単なファイルをテストしてるのですが、全角スペースのエラーって別のエラー
って。。。
imshow.cpp:3:4: warning: treating Unicode character as whitespace       [-Wunicode-whitespace]
https://swallow-incubate.com/archives/blog/20181221/

一度スペースを全部取り除いてもエラーが変わらないので再度コピペでコンパイルは通る様になりましたが、
wiwaomacbookair:~ wiwao$ ./a.out
-bash: ./a.out: No such file or directory
wiwaomacbookair:~ wiwao$ cd Desktop
wiwaomacbookair:Desktop wiwao$ ./a.out
^C

wiwaomacbookair:Desktop wiwao$ 

ないも出ない。。。。。。。。。。。。。。。。。。。。。
と言う事は相対パスがおかしいって事かな
と言う事で画像ファイルをDesktopに移すと出来ました。
やりやれです。

相対パスと絶対パスは勉強し直しです。Ubuntuでも適当にしてるからダメですね。
https://webliker.info/78726/


img = cv::imread("../Downloads/suwawachan.jpg");

追伸:
いろいろ変えているういちにどれが効いているか分かりません。

g++ imshow.cpp `pkg-config --cflags --libs opencv`
でもいいのですが、


echo export PKG_CONFIG_PATH==/usr/local/opt/opencv@3/lib/pkgconfig >> ~/.bashrc
が効いていません。??bashrcには書いてあります。
wiwaomacbookair:~ wiwao$ cd Desktop
wiwaomacbookair:Desktop wiwao$ g++ imshow.cpp `pkg-config --cflags --libs opencv`

Package opencv was not found in the pkg-config search path.

Perhaps you should add the directory containing `opencv.pc'

to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
imshow.cpp:1:10: fatal error: 'opencv2/opencv.hpp' file not found
#include <opencv2/opencv.hpp>
         ^~~~~~~~~~~~~~~~~~~~
1 error generated.
wiwaomacbookair:Desktop wiwao$ export PKG_CONFIG_PATH="/usr/local/opt/opencv@3/lib/pkgconfig"
wiwaomacbookair:Desktop wiwao$ g++ imshow.cpp `pkg-config --cflags --libs opencv`
wiwaomacbookair:Desktop wiwao$ ./a.out
^C
wiwaomacbookair:Desktop wiwao$ 
毎回export??

bash_profileでないといけない??????
適当にググると「とにかく何でも .bash_profile に書いとけばおk」みたいな嘘を書いたブログ記事がわんさか出てくるのでここに正解を書いておきます。

.bash_profile

.bash_profile はログイン時にのみ実行されます。具体的な用途は:
  • 環境変数を設定する (export する変数)
環境変数はプロセス間で勝手に受け継がれるのでログイン時のみ設定すれば十分です。

.bashrc

.bashrc は対話モードの bash を起動する時に毎回実行されます。具体的な用途は:
  • 環境変数でない変数を設定する (export しない変数)
  • エイリアスを定義する
  • シェル関数を定義する
  • コマンドライン補完の設定をする
これらは bash を起動する度に毎回設定する必要があるものです。

その他



でも
export PKG_CONFIG_PATH==/usr/local/opt/opencv@3/lib/pkgconfig
Macだから????

0 件のコメント:

コメントを投稿