2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|

2017-03-15 minGWを用いて, windows7にOpenCV3.1.0をインストールした時の話

参考文献 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
 
で稼動を確認
 
 

2020-03-15 go webassembly experiments をローカルPCで動かす

go webassembly experiments をローカルPCで動かす

go webassembly experiments をローカルPCで動かす

  • 2020/03/14

  • 背景
    • ■これからは「C/C++ → Go」と「JavaScript → Webassembly」とシフトしながら色々やっていこうと思っている

      ■正直、どっちも難しい。そういう時は、サンプルをパクって勉強するのが正解 ―― と思っている

  • 目的
  • 環境
    • ■Windows7 or 10
    • ■Go と python3 をインストールしてある
  • やってみたこと
    • ■サンプルプログラムをダウンロードして、コンパイルしてみた
      • ~ https://github.com/stdiopt/gowasm-experiments/tree/master/bouncy
      • コマンドプロンプトからこんな感じでコンパイルできた
        • $ set GOOS=js
        • $ set  GOARCH=wasm
        • $ go build -o main.wasm main.go
        • ちなみに、bashの環境があれば、build.shでコンパイルできる
      • 実際には、コンパイルしなくても、バイナリコード(main.wasm)も、ダウンロードの中に入っているので、コンパイルは不要だったが
    • ■ローカルサーバとしては、色々試してみた
      • python3 -m http.server 8080
      • Goでサーバも作ってみた
      • Perlでもやってみた
    • ■動画がどうしても出てこない
    • ■ここから丸2日間の格闘のスタート
      • もう、色々探しまくった
  • 確認していた問題点
    • ■Google Chromoから、→ 「その他のツール」 → 「ディベロッパーツール」 → 
      • Uncaught (in promise) TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.

        この「Expected 'application/wasm'.」がどうにも、不味いらしい ―― が、解決方法が、どうにも見つからない

    • ■kobore.netのサーバに上げても、改善が見られず
  • ローカルサーバを作ってみた
    • ■httpsrv.pyを作った
      #!/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()
        
  • ■httpsrv.pyを起動した
    • $ python3 httpsrv.py
  • http://localhost:8080 で起動
    • ■動いた

      ■動かなかったら、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 にあったので、そこから取ってきた。

  • 以上