質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

解決済

unsined charのポインタをstringのvectorでboostの共有メモリで格納し、子プロセスで戻したいが…

NEWBIEEBIEE
NEWBIEEBIEE

総合スコア61

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

1回答

0評価

0クリップ

3438閲覧

投稿2016/12/24 08:47

編集2016/12/24 10:09

失礼します。質問内容が題名とかけ離れているようで申し訳ございません。
処理の流れとしてはカメラで撮ったcv::Matをunsined char化し、stringの動的配列として共有メモリに格納し、子プロセスでstringをイテレータで順次,unsigned char化してcv::Matに戻して再生したいです。

しかし、問題があり、

vcap >> mat; MatToBytes(mat, &pBuf ); std::string sName; myshmvector->push_back(sName(pBuf));、

というコードで、MatToBytesにMatと pBufというunsigned charの二重ポインタを引数でとり、格納し、memcpyしたいのですが、
共有メモリのVectorにてStringで格納する際、
コンパイルエラーでno match for call to ‘(std::string {aka std::basic_string<char>}) (uchar*&)’
myshmvector->push_back(sName(pBuf));

二重ポインタのせいなのか、std::stringがbasic_stringに合わないのかわかりません。

どなたかご存じありませんか。どうかよろしくお願いします。

(自分はc++のことは全くわからないです)
(追記)
子プロセスのイテレータのも問題があるようで

MyShmStringVector::iterator it; cv::Mat mat; cv::VideoCapture vcap(0); uchar* pBuf = NULL; for(it = myvector->begin(); it !=myvector->end(); ++it){ pBuf = (unsigned char*)(*it).c_str(); std::memcpy(mat, pBuf, it->size()); cv::imshow("window1", mat); }

エラーでは
‘cv::Mat’ to ‘void*’ for argument ‘1’ to ‘void* memcpy(void*, const void*, size_t)’
std::memcpy(mat, pBuf, it->size());
が出力されます。
ごちゃごちゃしていてわからないと思いますが、ご教授の方お願いします。

全体のコードになります。(解りずらいと思いますが、説明下手と状況把握が不十分なので)

#include <boost/interprocess/managed_shared_memory.hpp> #include <boost/interprocess/containers/vector.hpp> #include <boost/interprocess/containers/string.hpp> #include <boost/interprocess/allocators/allocator.hpp> #include <string> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <cstdlib> // std::system using namespace boost::interprocess; typedef unsigned char uchar; typedef allocator<char, managed_shared_memory::segment_manager> CharAllocator; typedef basic_string<char, std::char_traits<char>, CharAllocator> MyShmString; typedef allocator<MyShmString, managed_shared_memory::segment_manager> StringAllocator; typedef vector<MyShmString, StringAllocator> MyShmStringVector; int MatToBytes(cv::Mat image, uchar ** pimage_uchar) { uchar * image_uchar = * pimage_uchar; // class data members of ints int image_rows = image.rows; int image_cols = image.cols; int image_type = image.type(); int image_size = image.total() * image.elemSize(); image_uchar = new uchar[image_size]; std::memcpy(image_uchar, image.data, image_size * sizeof(uchar)); return 1; } int main(int argc, char* argv[]) { struct shm_remove { shm_remove(){shared_memory_object::remove("MySharedMemory");} ~shm_remove(){shared_memory_object::remove("MySharedMemory");} }remover; if(argc == 1){ //Parent process // Remove shared memory on construction and destruction // Create a new segment with given name and size managed_shared_memory segment(create_only,"MySharedMemory",65536); //Initialize shared memory STL-compatible allocator CharAllocator charallocator(segment.get_segment_manager()); StringAllocator stringallocator(segment.get_segment_manager()); //Construct a vector named "MyVector" in shared memory with argument alloc_inst MyShmStringVector *myshmvector = segment.construct<MyShmStringVector>("MyVector")(stringallocator); cv::Mat InputImage; cv::Mat mat; cv::VideoCapture vcap(0); uchar* pBuf = NULL; if (!vcap.isOpened()) return -1; while (1) { vcap >> mat; MatToBytes(mat, &pBuf ); std::string sName; myshmvector->push_back(sName(pBuf)); //Launch child process if(cv::waitKey(30) >= 0) break; } // Launch child process std::string s(argv[0]); s += " child"; if(0 != std::system(s.c_str())) return 1; // check child has destroyed the vector if(segment.find<MyShmStringVector>("MyVector").first) return 1; } else{// child process // Open the managed segment managed_shared_memory segment(open_only, "MySharedMemory"); // Find the vector using c-string name MyShmStringVector *myvector = segment.find<MyShmStringVector>("MyVector").first; // Use vector in reverse order MyShmStringVector::iterator it; cv::Mat mat; cv::VideoCapture vcap(0); uchar* pBuf = NULL; for(it = myvector->begin(); it !=myvector->end(); ++it){ pBuf = (unsigned char*)(*it).c_str(); std::memcpy(mat, pBuf, it->size()); cv::imshow("window1", mat); } segment.destroy<MyShmStringVector>("MyVector"); } return 0; }

12/24 19:08 Chironianさんの回答元に更新しました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。