参考文献 http://www.malab.se.ritsumei.ac.jp/jp/member_only/page-4220/
前提: mingwは4ベースの(現時点での最新gcc version 4.9.1 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) )を使用
[Step1] opencv-3.1.0.exe をダウンロードして、c:\の直下に展開
[Step2] GUI版のCmakeもダウンロードして、適当なところに展開
[Step3] cmakeを立ち上げて、(1)"Where is the source code" を"C:/opencv/sources"に、(2)"Where is the build code" を"C:/opencv/build/x68/test_mingw"に、(2)Current Generator:#MinGW Makefiles"に設定
[Step4] configure..で、真っ赤になって上手くいかないので、
BUILD_DOCS OFF WITH_FFMPEG OFF WITH_IPP OFF WITH_TBB ON
とすると、上手くいく(こともある) → configureして白くなったら, Generateです(これもしつこく押していると、いずれ白くなることがある)
C:/opencv3.0.0/sources/Cmake/OpenCVCompilerOptions.cmake” のファイルの中身 add_extra_compiler_option(-Werror=non-virtual-dtor) を #add_extra_compiler_option(-Werror=non-virtual-dtor) に変えることで, make時のエラーをパスする(らしい)
[Step4] cd C:\opencv\build\x64\test_mingw
で、 mingw32-make で mingw32-make install
[Step5] "C:\opencv\build\x64\test_mingw\bin"にPathを通しておく。あとはPC再起動しておいた方が安心
試してみたファイル(ネットに落ちていたものの一部(インクルード)を変更)
#include <stdio.h> #include "opencv2/highgui/highgui.hpp" #include <time.h> int main (int argc, char **argv) { int i, j; int nrow = 3; int ncol = 3; CvMat *src, *dst, *mul; double det; CvRNG rng = cvRNG (time (NULL)); /* 乱数の初期化 */ // (1) 行列のメモリ確保 src = cvCreateMat (nrow, ncol, CV_32FC1); dst = cvCreateMat (ncol, nrow, CV_32FC1); mul = cvCreateMat (nrow, nrow, CV_32FC1); // (2) 行列srcに乱数を代入 printf ("src\n"); cvmSet (src, 0, 0, 1); for (i = 0; i < src->rows; i++) { for (j = 0; j < src->cols; j++) { cvmSet (src, i, j, cvRandReal (&rng)); printf ("% lf\t", cvmGet (src, i, j)); } printf ("\n"); } // (3) 行列srcの逆行列を求めて,行列dstに代入 det = cvInvert (src, dst, CV_SVD); // (4) 行列srcの行列式を表示 printf ("det(src)=%lf\n", det); // (5) 行列dstの表示 printf ("dst\n"); for (i = 0; i < dst->rows; i++) { for (j = 0; j < dst->cols; j++) { printf ("% lf\t", cvmGet (dst, i, j)); } printf ("\n"); } // (6) 行列srcとdstの積を計算して確認 cvMatMul (src, dst, mul); printf ("mul\n"); for (i = 0; i < mul->rows; i++) { for (j = 0; j < mul->cols; j++) { printf ("% lf\t", cvmGet (mul, i, j)); } printf ("\n"); } // (7) 行列のメモリを開放 cvReleaseMat (&src); cvReleaseMat (&dst); cvReleaseMat (&mul); return 0; }
なんとか通したコンパイル
g++ -I"C:\opencv\build\include" -L"C:\opencv\build\x64\test_mingw\lib" test.cpp -lopencv_calib3d310 -lopencv_core310 -lopencv_features2d310 -lopencv_flann310 -lopencv_highgui310 -lopencv_imgcodecs310 -lopencv_imgproc310 -lopencv_ml310 -lopencv_objdetect310 -lopencv_photo310 -lopencv_shape310 -lopencv_stitching310 -lopencv_superres310 -lopencv_video310 -lopencv_videoio310 -lopencv_videostab310 -o test (よく分からないので、dllを全部リンクした悪例) (コンパイル時には改行は取ること)
実行結果
d:\>test test src 0.174088 0.378289 0.761955 0.174153 0.467867 0.709499 0.328849 0.444654 0.578379 det(src)=0.043136 dst 2.825524 -7.556030 5.546670 -8.348085 9.436506 -0.578052 4.811443 -2.958592 -0.980295 mul 1.000000 0.000000 -0.000000 0.000000 1.000001 0.000000 -0.000000 0.000000 1.000000
opencvを使ってライブラリを作る時の手順(私だけが分かれば良い)
■前提環境 (http://www.kobore.net/diary_techno/?date=20170315 に記載されたことを実施する) ■実施手順 (1)ファイル修正(2箇所のみ) D:\home\resource2\src\TransporterResourceProposerDll\include\SequentialCsvReader.h に #include <stdexcept> を追加 D:\home\resource2\src\TransporterResourceProposerDll\ //ss >> std::get_time(&timeval, "%H:%M"); ebata 1行コメントアウト を実施 (この1行だけは、どうしてもコンパイルエラーが取れなかった) (2)オブジェクト作成 D:\home\resource2\src\TransporterResourceProposerDllにて g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" -I"C:\opencv\build\include" SequentialCsvReader.cpp -o SequentialCsvReader.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" api.cpp -o api.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" common_utils.cpp -o common_utils.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" TransporterResourceTable.cpp -o TransporterResourceTable.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" TransporterResourceProposer.cpp -o TransporterResourceProposer.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" StationTable.cpp -o StationTable.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" FlowGraph.cpp -o FlowGraph.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" -I"C:\opencv\build\include" PassengerVectorIntegrator.cpp -o PassengerVectorIntegrator.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" -I"C:\opencv\build\include" MaxFlowPathOptimizer.cpp -o MaxFlowPathOptimizer.o -std=c++11 g++ -c -I"D:\home\resource2\src\TransporterResourceProposerDll\include" SimpleLogWriter.cpp -o SimpleLogWriter.o -std=c++11 (3)ライブラリの作成 → ここでは"testtest.dll"という名前にしておく g++ -I"D:\home\resource2\src\TransporterResourceProposerDll\include" -I"C:\opencv\build\include" -I"C:\opencv\build\include" -L"C:\opencv\build\x64\test_mingw\lib" -shared -o testtest.dll api.o common_utils.o FlowGraph.o MaxFlowPathOptimizer.o PassengerVectorIntegrator.o SequentialCsvReader.o SimpleLogWriter.o StationTable.o TransporterResourceProposer.o TransporterResourceTable.o -lopencv_calib3d310 -lopencv_core310 -lopencv_features2d310 -lopencv_flann310 -lopencv_highgui310 -lopencv_imgcodecs310 -lopencv_imgproc310 -lopencv_ml310 -lopencv_objdetect310 -lopencv_photo310 -lopencv_shape310 -lopencv_stitching310 -lopencv_superres310 -lopencv_video310 -lopencv_videoio310 -lopencv_videostab310 -std=c++11 (ちなみに、上記のリンクは、面倒くさかったので、片っ端からリンクしたものであって、多分、こんなにリンクする必要はないはず。ちなみにコピベする時は、改行をを取り除くこと) (4)テストファイルの作成 D:\home\resource2\src\TransporterResourceProposerに移動して testtest.dllをここに移動した後、 g++ -L./ -o resource_proposer_main.exe resource_proposer_main.cpp -ltestest (ちなみに、この" -L./" (← リンクの場所を指定(ローカルであっても) が、あなどれないので注意) (5)実行テスト resource_proposer_main station _info.csv transport_resource_info.csv person_vector_info.csv restoration_time.csv new_transporters.csv, new_routes.csv, inout_table.csv で稼動を確認
go webassembly experiments をローカルPCで動かす
2020/03/14
■これからは「C/C++ → Go」と「JavaScript → Webassembly」とシフトしながら色々やっていこうと思っている
■正直、どっちも難しい。そういう時は、サンプルをパクって勉強するのが正解 ―― と思っている
■取り敢えず、https://github.com/stdiopt/gowasm-experiments にある、 https://stdiopt.github.io/gowasm-experiments/bouncy/ をローカルで動かせるようになろう、と考えた
Uncaught (in promise) TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.
この「Expected 'application/wasm'.」がどうにも、不味いらしい ―― が、解決方法が、どうにも見つからない
#!/usr/bin/env python3 import http.server import socketserver PORT = 8080 Handler = http.server.SimpleHTTPRequestHandler Handler.extensions_map.update({ '.wasm': 'application/wasm', }) socketserver.TCPServer.allow_reuse_address = True with socketserver.TCPServer(("", PORT), Handler) as httpd: httpd.allow_reuse_address = True print("serving at port", PORT) httpd.serve_forever()
■動いた
■動かなかったら、chromo → 「設定」 → 「閲覧履歴データの削除」でキャッシュをクリアてみること
■Windows10の環境では、独自につくったmain.wasmを動かすと、Uncaught (in promise) LinkError: WebAssembly Instantiation: Import #1 module="go" function="runtime.scheduleCallback" error: function import requires a callable というエラーが出てくることがある。この場合は、Windows10のGoの環境にあるwasm_exec.jsをパクってくる。私の場合は、C:\Go\misc\wasm にあったので、そこから取ってきた。
以上