Mingw用でcore.libを作るためのコマンドをどのように改善すればよいでしょうか?
<環境>
Windows10 64bit
OPENCV3.4.0
gcc(MinGW)
cv::parallel_for_を使ってみる · atinfinity/lab Wiki
上記のサイトを参考にgccでコンパイルしようとしたのですが、エラーが消えません。
こちらがプログラムです。
#include <opencv2/core.hpp>
#include <iostream>
// 自作二値化関数
void my_threshold
(
const cv::Mat& src, cv::Mat& dst,
double thresh, double max_value
)
{
int x, y = 0;
unsigned char intensity = 0;
for (y = 0; y < src.rows; y++)
{
for (x = 0; x < src.cols; x++)
{
intensity = src.at<unsigned char>(y, x);
if (intensity < (unsigned char)thresh)
{
dst.at<unsigned char>(y, x) = 0;
}
else
{
dst.at<unsigned char>(y, x) = (unsigned char)max_value;
}
}
}
}
// cv::parallel_for_利用コード
class TestParallelLoopBody : public cv::ParallelLoopBody
{
private:
cv::Mat _src;
cv::Mat _dst;
double _thresh;
double _max_value;
public:
TestParallelLoopBody
(
const cv::Mat& src, cv::Mat& dst,
double thresh, double max_value
)
: _src(src), _dst(dst), _thresh(thresh), _max_value(max_value) { }
void operator() (const cv::Range& range) const
{
int row0 = range.start;
int row1 = range.end;
cv::Mat srcStripe = _src.rowRange(row0, row1);
cv::Mat dstStripe = _dst.rowRange(row0, row1);
my_threshold(srcStripe, dstStripe, _thresh, _max_value);
}
};
int main(int argc, char *argv[])
{
cv::Mat src(cv::Size(5000, 5000), CV_8UC1, cv::Scalar(255));
cv::Mat dst = cv::Mat::zeros(src.size(), src.type());
double f = 1000.0f / cv::getTickFrequency();
int64 start = cv::getTickCount();
// 自作二値化関数の実行
my_threshold(src, dst, 100, 255);
int64 end = cv::getTickCount();
std::cout << "my_threshold: " <<
(end - start) * f << "[ms]" << std::endl;
start = cv::getTickCount();
// cv::parallel_for_を使って自作二値化関数を並列化
cv::parallel_for_
(
cv::Range(0, dst.rows),
TestParallelLoopBody(src, dst, 100, 255)
);
end = cv::getTickCount();
std::cout << "my_threshold(parallel_for_): "
<< (end - start) * f << "[ms]" << std::endl;
return 0;
}
こちらがエラーです。
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text+0x1ca): undefined reference to `cv::Mat::zeros(cv::Size_<int>, int)'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text+0x1f5): undefined reference to `cv::getTickFrequency()'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text+0x205): undefined reference to `cv::getTickCount()'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text+0x23c): undefined reference to `cv::getTickCount()'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text+0x2c2): undefined reference to `cv::getTickCount()'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text+0x33a): undefined reference to `cv::parallel_for_(cv::Range const&, cv::ParallelLoopBody const&, double)'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text+0x34c): undefined reference to `cv::getTickCount()'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZN2cv3MatC1ENS_5Size_IiEEiRKNS_7Scalar_IdEE[__ZN2cv3MatC1ENS_5Size_IiEEiRKNS_7Scalar_IdEE]+0xc5): undefined reference to `cv::Mat::operator=(cv::Scalar_<double> const&)'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZN2cv3MatC1ERKS0_[__ZN2cv3MatC1ERKS0_]+0x148): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZN2cv3MatD1Ev[__ZN2cv3MatD1Ev]+0x2d): undefined reference to `cv::fastFree(void*)'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZNK2cv3Mat8rowRangeEii[__ZNK2cv3Mat8rowRangeEii]+0x48): undefined reference to `cv::Mat::Mat(cv::Mat const&, cv::Range const&, cv::Range const&)'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZN2cv3Mat6createEiii[__ZN2cv3Mat6createEiii]+0x81): undefined reference to `cv::Mat::create(int, int const*, int)'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZN2cv3Mat7releaseEv[__ZN2cv3Mat7releaseEv]+0x40): undefined reference to `cv::Mat::deallocate()'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZN2cv16ParallelLoopBodyC2Ev[__ZN2cv16ParallelLoopBodyC2Ev]+0xa): undefined reference to `vtable for cv::ParallelLoopBody'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZN20TestParallelLoopBodyC1ERKN2cv3MatERS1_dd[__ZN20TestParallelLoopBodyC1ERKN2cv3MatERS1_dd]+0x92): undefined reference to `cv::ParallelLoopBody::~ParallelLoopBody()'
C:\Users\Daito\AppData\Local\Temp\cclYfOQ1.o:heikousyorinitika.cpp:(.text$_ZN20TestParallelLoopBodyD1Ev[__ZN20TestParallelLoopBodyD1Ev]+0x33): undefined reference to `cv::ParallelLoopBody::~ParallelLoopBody()'
collect2.exe: error: ld returned 1 exit status
コマンドでちゃんとライブラリが指定できていないのかもしれません。
どうか解決のために助けてください。
ライブラリはcore.libが必要だと思いC:\Users\opencv-3.4.0\Build\lib\Releaseからopencv_core340.libをコマンドで指定しました。
書いたコマンドはこちらです。g++ -o -L/Users/opencv-3.4.0/Build/lib/Release -opencv_core340 C:\Users\name\Desktop\heikousyorinitika.cpp
サイトにはOPENCV3.0を使ったとのことですがcore.libが見当たらなかったためopencv3.4.0を使いました。
質問に致命的ミスがあったため編集いたします。
本来の質問とは変わりますがコマンドに関する質問であります。
プログラムに使われているopencv2に入っているcore.hppのライブラリcore.libをMingwで作りたいのですがコマンドをどのように改善したらよいでしょうか?
Mingw用でcore.libを作るにはcoreのⅭソースコードをMingwでコンパイルしてバイナリファイルにできれば作れると思います。
D:\opencv-3.4.0\modules\core\srcに入っているソースをMingwでコンパイルしてMingw用のライブラリがほしいです。