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 オプションを選択してください。)


もし、解決しないようであれば、再現コードをご連絡ください。
編集
診断人  2016/08/16(Tue) 00:20
返信するのを忘れていました。ごめんなさい。

上記のコードは動き、openCVも使用することができました。ありがとうございました。
編集
件名
Re: Siv3D上でOpenCVを使用する方法
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -