[openrtm-users 03362] 「画像処理コンポーネントの作成」におけるcv::Matとデータポート

MASUTANI Yasuhiro masutani @ osakac.ac.jp
2017年 2月 5日 (日) 18:00:44 JST


OpenRTM MLの皆様,

大阪電通大の升谷です.連投失礼します.

WindowsでOpenRTM-aist-1.1.2-RELEASE_x86_64.msiをインストールし,Visual
Studio 2012で使っています.

  画像処理コンポーネントの作成
  (Windows 8.1, OpenRTM-aist-1.1.2-RELEASE, OpenRTP-1.1.2, CMake-3.5.1, VS2013)
  http://openrtm.org/openrtm/ja/node/6057

を試しているのですが,cv::Matとデータポートの使い方で相談に乗っていた
だきたくメイルいたしました.

cv::Matには,ユーザが確保したメモリ領域をデータにする機能がありますの
で,それを使えばメモリ領域の確保(create())やデータのコピー(memcpy())
をせずに済み,パフォーマンスが向上し,コードも単純になると考えました.

  http://opencv.jp/cookbook/opencv_mat.html

そこで,Flip.cppのonExecute()を以下のように書き換えました.

------------------------------------------------------------------------
RTC::ReturnCode_t Flip::onExecute(RTC::UniqueId ec_id)
{
  // 新しいデータのチェック
  if (m_originalImageIn.isNew()) {
    // InPortデータの読み込み
    m_originalImageIn.read();
    cv::Mat originalMat(m_originalImage.height, m_originalImage.width, CV_8UC3, (void *)&(m_originalImage.pixels[0]));

    m_flippedImage.width = m_originalImage.width;
    m_flippedImage.height = m_originalImage.height;
    int len = 3*m_flippedImage.width*m_flippedImage.height;
    m_flippedImage.pixels.length(len);
    cv::Mat flippedMat(m_flippedImage.height, m_flippedImage.width, CV_8UC3, (void *)&(m_flippedImage.pixels[0]));

    // InPortからの画像データを反転する。 m_flipMode 0: X軸周り, 1: Y軸周り, -1: 両方の軸周り
    cv::flip(originalMat, flippedMat, m_flipMode);

    // 反転した画像データをOutPortから出力する。
    m_flippedImageOut.write();
  }

  return RTC::RTC_OK;
}
------------------------------------------------------------------------

ビルドは通り,OpenCVCameraCompとCameraViewerCompを組み合わせて動作も確
認したのですが,しばらくすると,FlipComp.exeが停止します.何度も試して
みましたが,「しばらく」というのはバラバラで数分後のときもあり,1時間
後の時もあります.

初回例外が 0x00007FFB1707A2C9 (msvcr110d.dll) で発生しました (FlipComp.exe 内): 0xC0000005: 場所 0x0000000000000000 の読み取り中にアクセス違反が発生しました。
ハンドルされない例外が 0x00007FFB1707A2C9 (msvcr110d.dll) で発生しました(FlipComp.exe 内): 0xC0000005: 場所 0x0000000000000000 の読み取り中にアクセス違反が発生しました。

というような表示で終わり,デバッガで追いかけようとしても,「memcpy.asm
が見つかりません」となり,また,呼び出し履歴は「msvcr110d.dll!memcpy()
行129」と1行表示されているだけです.

cv::Matをデータポートの組み合わせとして不適切なやり方でしょうか?

原因を特定するためにどのように調べたらいいでしょうか?

コメントやアドバイスをいただけると幸いです.
よろしくお願いいたします.

-- 
# 升谷 保博
# 大阪電気通信大学 総合情報学部 情報学科
# 575-0063 大阪府四條畷市清滝1130-70 / TEL&FAX: 072-876-5107


More information about the openrtm-users mailing list