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

宮本信彦 n-miyamoto @ aist.go.jp
2017年 2月 7日 (火) 10:43:40 JST


升谷先生

産総研の宮本です。

FlipComp.exeが停止する件ですが、OpenRTM-aist 1.1.2のC++版に実装されているPortProfileからデータ値を取得する機能の不具合が原因だと思います。


OutPort.hの以下の部分でpropertiesにデータを格納するタイミングにRTシステムエディタ等でPortProfileを取得すると問題が発生することがあります。


virtual bool write(DataType& value)
{
     RTC_TRACE(("DataType write()"));

     if (m_onWrite != NULL)
     {
          (*m_onWrite)(value);
          RTC_TRACE(("OnWrite called"));
     }
     m_profile.properties[m_propValueIndex].value <<= value;



お手数ですが、OutPort.hを添付のファイルに置き換えてもらえますでしょうか。

OutPort.hはC:\Program Files\OpenRTM-aist\1.1.2\rtmにがあります。

よろしくお願いします。

-----Original Message-----
From: openrtm-users-bounces @ openrtm.org [mailto:openrtm-users-bounces @ openrtm.org] On Behalf Of MASUTANI Yasuhiro
Sent: Sunday, February 5, 2017 6:01 PM
To: Users mailinglist of OpenRTM-aist <openrtm-users @ openrtm.org>
Subject: [openrtm-users 03362] 「画像処理コンポーネントの作成」におけるcv::Matとデータポート

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 _______________________________________________
openrtm-users mailing list
openrtm-users @ openrtm.org
http://www.openrtm.org/mailman/listinfo/openrtm-users
-------------- next part --------------
文字コード指定の無い添付文書を保管しました...
名前: OutPort.h
URL:  <http://www.openrtm.org/pipermail/openrtm-users/attachments/20170207/1a52166a/attachment.h>


More information about the openrtm-users mailing list