[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