回答編集履歴
2
エイリアスを用意する
test
CHANGED
@@ -30,6 +30,10 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
+
名前だけの問題であれば、エイリアスを用意することで無理矢理使用することは出来ます(実際の例は後述)。ただし、名前が異なるだけではなく、内部の構造もコンパイル依存の所が存在するため、必ずうまくいくとは限りません。手動でエイリアスを用意するなどの苦労するばかりか、うまくいかなくて徒労に終わる可能性が高いため、推奨は出来ません。
|
34
|
+
|
35
|
+
|
36
|
+
|
33
37
|
---
|
34
38
|
|
35
39
|
|
@@ -49,3 +53,195 @@
|
|
49
53
|
* OpenCV 3からCのAPIは非推奨になり、C++のAPIを使うことが推奨されています。しかし、CのAPIを使用できないわけではありません。
|
50
54
|
|
51
55
|
* Cmakeは依存関係等を解決してMakefileやVisual Studioのプロジェクトファイルを作成するツールです。往年のautomakeに取って代わるツールですが、UNIX/Linux環境のみならず、WindowsでのVisual Studioにも対応しているなど、マルチプラットフォームなC/C++プログラムで特に使われるようになっているツールです。
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
---
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
### OpenCVの公式バイナリをMinGW GCCから無理矢理使う方法
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
MSYS2+MINGW64環境で実施します。GCCおよびdlltool等はインストール済みとします。また、VS2017のランタイムもインストール済みとします。特に明記しませんが、Windows 10の64bit環境です。`$`はシェルのプロンプトになります。
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
1, 作業フォルダーにソースコード"sample.c"を置き、次のように書き換えます。(画像のファイル名を設定し、不要なヘッダを削除しただけです)
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
sample.c
|
76
|
+
|
77
|
+
```C
|
78
|
+
|
79
|
+
#include <opencv2/opencv.hpp>
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
int main(void)
|
84
|
+
|
85
|
+
{
|
86
|
+
|
87
|
+
cv::Mat src_img;
|
88
|
+
|
89
|
+
src_img = cv::imread("sample.jpg", 1);
|
90
|
+
|
91
|
+
// 画像が読み込まれなかったらプログラム終了
|
92
|
+
|
93
|
+
if (src_img.empty()) return -1;
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
// 結果画像表示
|
98
|
+
|
99
|
+
cv::namedWindow("Image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
|
100
|
+
|
101
|
+
cv::imshow("Image", src_img);
|
102
|
+
|
103
|
+
cv::waitKey(0);
|
104
|
+
|
105
|
+
}
|
106
|
+
|
107
|
+
```
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
2, 適当なJPEGファイルを作業フォルダーにおいて、"sample.jpg"という名前にします。
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
3, OpenCVのWindows版公式バイナリopencv-3.4.1-vc14_vc15.exeを実行し、Cドライブ直下にインストールします。"C:\opencv\build\x64\vc15\bin\opencv_world341.dll"を作業フォルダーにコピーします。
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
```
|
120
|
+
|
121
|
+
$ cp /c/opencv/build/x64/vc15/bin/opencv_world341.dll .
|
122
|
+
|
123
|
+
```
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
4, 下記内容のDEFファイル"opencv_world341_gcc.def"を作成します。
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
opencv_world341_gcc.def
|
132
|
+
|
133
|
+
```DEF
|
134
|
+
|
135
|
+
LIBRARY "opencv_world341.dll"
|
136
|
+
|
137
|
+
EXPORTS
|
138
|
+
|
139
|
+
; cv::String::allocate(unsigned long long)
|
140
|
+
|
141
|
+
?allocate@String@cv@@AEAAPEAD_K@Z
|
142
|
+
|
143
|
+
_ZN2cv6String8allocateEy==?allocate@String@cv@@AEAAPEAD_K@Z
|
144
|
+
|
145
|
+
; cv::Mat::deallocate()
|
146
|
+
|
147
|
+
?deallocate@Mat@cv@@QEAAXXZ
|
148
|
+
|
149
|
+
_ZN2cv3Mat10deallocateEv==?deallocate@Mat@cv@@QEAAXXZ
|
150
|
+
|
151
|
+
; cv::fastFree(void*)
|
152
|
+
|
153
|
+
?fastFree@cv@@YAXPEAX@Z
|
154
|
+
|
155
|
+
_ZN2cv8fastFreeEPv==?fastFree@cv@@YAXPEAX@Z
|
156
|
+
|
157
|
+
; cv::imread(cv::String const&, int)
|
158
|
+
|
159
|
+
?imread@cv@@YA?AVMat@1@AEBVString@1@H@Z
|
160
|
+
|
161
|
+
_ZN2cv6imreadERKNS_6StringEi==?imread@cv@@YA?AVMat@1@AEBVString@1@H@Z
|
162
|
+
|
163
|
+
; cv::String::deallocate()
|
164
|
+
|
165
|
+
?deallocate@String@cv@@AEAAXXZ
|
166
|
+
|
167
|
+
_ZN2cv6String10deallocateEv==?deallocate@String@cv@@AEAAXXZ
|
168
|
+
|
169
|
+
; cv::namedWindow(cv::String const&, int)
|
170
|
+
|
171
|
+
?namedWindow@cv@@YAXAEBVString@1@H@Z
|
172
|
+
|
173
|
+
_ZN2cv11namedWindowERKNS_6StringEi==?namedWindow@cv@@YAXAEBVString@1@H@Z
|
174
|
+
|
175
|
+
; cv::imshow(cv::String const&, cv::_InputArray const&)
|
176
|
+
|
177
|
+
?imshow@cv@@YAXAEBVString@1@AEBV_InputArray@1@@Z
|
178
|
+
|
179
|
+
_ZN2cv6imshowERKNS_6StringERKNS_11_InputArrayE==?imshow@cv@@YAXAEBVString@1@AEBV_InputArray@1@@Z
|
180
|
+
|
181
|
+
; cv::waitKey(int)
|
182
|
+
|
183
|
+
?waitKey@cv@@YAHH@Z
|
184
|
+
|
185
|
+
_ZN2cv7waitKeyEi==?waitKey@cv@@YAHH@Z
|
186
|
+
|
187
|
+
```
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
5, 下記コマンドを実行し、libopencv_world341.aを作成します。
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
```
|
196
|
+
|
197
|
+
$ dlltool -D opencv_world341.dll -d opencv_world341_gcc.def -l libopencv_world341_gcc.a
|
198
|
+
|
199
|
+
```
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
6, 作成したライブラリにリンクしてコンパイルします。
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
```
|
208
|
+
|
209
|
+
$ g++ -O2 -Wall -std=c++17 -I/c/opencv/build/include -L. sample.cpp -lopencv_world341_gcc -o sample.exe
|
210
|
+
|
211
|
+
```
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
7, MSYS2環境でsample.exeを実行できるか確認します。
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
```
|
220
|
+
|
221
|
+
$ ./sample.exe
|
222
|
+
|
223
|
+
```
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
8, エクスプローラー上でも実行できるように依存関係のDLLをコピーしておきます。
|
228
|
+
|
229
|
+
|
230
|
+
|
231
|
+
```
|
232
|
+
|
233
|
+
$ cp /mingw64/bin/libgcc_s_seh-1.dll .
|
234
|
+
|
235
|
+
$ cp /mingw64/bin/libstdc++-6.dll .
|
236
|
+
|
237
|
+
$ cp /mingw64/bin/libwinpthread-1.dll .
|
238
|
+
|
239
|
+
```
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
9, エクスプローラー上でsample.exeをダブルクリックすると画像が表示されます。
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
これで完了です。お疲れ様でした。シンボル名を調べるのは二度とやりたくないです。なお、この方法は必ずうまくいくとは限らず、今回はたまたまうまくいっただけに過ぎません。私もよくわかっていない(特にDEFファイルが未だによくわからない)ため、解説はありません。
|
1
OpenCVを使った。
test
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
* OpenCV 3.4.1の公式バイナリのWindows版はVisual Studio 2015とVisual Studio 2017のVC++用にコンパイルされています。DLLおよびLIBはその二つから使えるようになっていますが、MinGW GCC等のVisual Studio以外のコンパイラから使用できるようにはなっていません(理由は上で述べたとおりです)。MinGW GCC用のバイナリは公式にはありません。
|
42
42
|
|
43
|
-
* MSYS2にはOpenCVのバイナリパッケージ(mingw-w64-x86_64-opencvとmingw-w64-i686-opencv)が存在します。そちらを使えばMSYS2環境でのMinGW GCCでOpenCVをコンパイルすることは可能です。OpenCV自体をMSYS2上でコンパイルするためのパッチおよび手順もMSYS2のレポジトリに公開されています。
|
43
|
+
* MSYS2にはOpenCVのバイナリパッケージ(mingw-w64-x86_64-opencvとmingw-w64-i686-opencv)が存在します。そちらを使えばMSYS2環境でのMinGW GCCでOpenCVを使ったプログラムをコンパイルすることは可能です。OpenCV自体をMSYS2上でコンパイルするためのパッチおよび手順もMSYS2のレポジトリに公開されています。
|
44
44
|
|
45
45
|
* OpenCVはCmakeを使うことを前提に設計されています。OpenCVをコンパイルする場合はCmakeを用いて依存関係を解決したMakefileやVisual Studioのプロジェクトファイルを作る必要があります。OpenCVを使うプログラムを作る場合も、Cmakeで依存関係を解決できるようにCmakeのファイルが用意されています。
|
46
46
|
|