[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