Siv3D上でOpenCVを使用する方法
診断人 2015/10/28(Wed) 10:46
お世話になっております。7月ごろにtwitterで質問したものの続きなのですが、
Siv3D上でOpenCVを使用することは可能でしょうか?
OpenCVの同バージョン(2.4.9)のヘッダを追加することで、コンパイルをすることは
できましたが、任意のopenCVの関数を呼ぶとOpenCV exceptionが発生してしまいます。
また、自分でOpenCVをインストールして、そちらを使用するということでも、問題はないのですが、
その場合はSiv3D内に入っているOpenCVのライブラリをシンボルが衝突してしまいそうな気が
します。
もし、何か良い解決方法があればアドバイスをいただけると助かります。よろしくお願いいたします。
Reputeless 2015/10/28(Wed) 22:27
[1]
一部の OpenCV モジュールが Siv3D June 2015 v2 に付属しています。
OpenCV 2.4.9 のヘッダをインクルードするだけで、OpenCV を使った以下のようなコードを実行できます。
# include <opencv2/opencv.hpp>
# include <Siv3D.hpp>
void Main()
{
{
Image image(L"Example/Windmill.png");
cv::Mat_<cv::Vec4b> matSrc(image.height, image.width, const_cast<cv::Vec4b*>(static_cast<const cv::Vec4b*>(image.data())), image.stride);
cv::Mat_<cv::Vec4b> matDst(image.height, image.width, static_cast<cv::Vec4b*>(image.data()), image.stride);
cv::GaussianBlur(matSrc, matDst, cv::Size(11, 11), 0.0);
image.save(L"gaussian.png");
}
const int32 deviceID = 0;
const int32 width = 640, height = 480;
cv::VideoCapture camera(deviceID);
if (!camera.isOpened())
{
MessageBox::Show(L"カメラデバイスの初期化に失敗しました");
return;
}
if (!camera.set(CV_CAP_PROP_FRAME_WIDTH, width)
|| !camera.set(CV_CAP_PROP_FRAME_HEIGHT, height)
|| camera.get(CV_CAP_PROP_FRAME_WIDTH) != width
|| camera.get(CV_CAP_PROP_FRAME_HEIGHT) != height)
{
MessageBox::Show(L"サポートされていないカメラの解像度です");
return;
}
cv::Mat_<cv::Vec3b> frame;
Image image;
DynamicTexture texture;
while (System::Update())
{
if (camera.grab() && camera.retrieve(frame))
{
image.resize(width, height, Palette::Black);
Color* pDst = image[0];
const Color* pDstEnd = pDst + image.num_pixels;
uint8* pSrc = frame.data;
while (pDst != pDstEnd)
{
pDst->b = *(pSrc++);
pDst->g = *(pSrc++);
pDst->r = *(pSrc++);
++pDst;
}
texture.fill(image);
}
if (texture)
{
texture.draw();
}
}
}
[2]
Siv3D に付属しない OpenCV モジュールの関数を使用した場合、リンカエラーになります。
その場合は必要なモジュールの .lib を追加でリンクしてください。
この際、OpenCV に最初から付属している .lib ファイルを使用するとランタイムエラーが生じることがあります。
お手数ですが、必要なモジュールの .lib ファイルを自前でビルドしてください。
(Debug 用は /MTd, Release 用は /MT オプションを選択してください。)
もし、解決しないようであれば、再現コードをご連絡ください。