C++dllのOpenCVによって得た画像データを、プロセス間通信をおこないC#へ渡したいです。
共有メモリは動いているようですが、C#側のStreamReadにデータが入っておらず、
全ての要素に0が入っている状態です。
C#側へデータを配列で渡す方法、または
配列以外でデータを渡すよい方法など、ご教授いただきたく思います。
C++
1コード 2 //--- レンズ歪み補正 ---// 3 cv::undistort(dst, dst2, Mtx, Dist); //L 4 DWORD size = dst.dataend - dst.datastart; 5 //--- 動画保存 ---// 6 writer << dst2; 7 cv::imshow("window-cam" + std::to_string(camNo) + "", dst2);//画像を表示. 8 9 //--- dataを配列に格納する ---// 10 byte *imgarray = new byte[dst2.rows * dst2.cols * dst2.channels()]; // 11 12 for (int y = 0; y < dst2.rows; y++) { 13 // ポインタの取得 14 cv::Vec3b* ptr = dst2.ptr<cv::Vec3b>(y); 15 for (int x = 0; x < dst2.cols; x++) { 16 // 値の取得 17 // 対象のピクセルが赤だった場合、BGRの順に"0,0,255"と出力される。 18 cv::Vec3b bgr = ptr[x]; 19 //printf("%d,%d,%d\n", bgr[0], bgr[1], bgr[2]); 20 21 //--- 配列へデータを格納 ---// 22 imgarray[(y * dst2.rows) + (3 * x) + 0] = bgr[0]; 23 imgarray[(y * dst2.rows) + (3 * x) + 1] = bgr[1]; 24 imgarray[(y * dst2.rows) + (3 * x) + 2] = bgr[2]; 25 } 26 } 27 //--- MemoryMappedFile記述 ---// 28 //HANDLE hShareMemory = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, false, "ImageAccess"); 29 HANDLE hShareMemory = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, "ImageAccess"); 30 if (NULL != hShareMemory) { 31 printf("共有メモリオープン成功\n"); 32 //--- 共有メモリマッピング ---// 33 void* cpSharedMemory = ::MapViewOfFile(hShareMemory, FILE_MAP_WRITE, 0, 0, size); //戻り値 開始アドレス 34 if (NULL != cpSharedMemory) { 35 printf("共有メモリマッピング成功 %x", (DWORD)cpSharedMemory); //ハンドル表示 36 37 //--- データコピー ---// 38 //memcpy(imgarray, &dst.data, size); 39 memcpy(cpSharedMemory, imgarray, sizeof(unsigned char) * size); 40 //--- 共有マッピング解除 ---// 41 ::UnmapViewOfFile(cpSharedMemory); 42 } 43 else { 44 printf("共有マッピング失敗\n"); 45 } 46 47 } 48 else { 49 printf("共有メモリオープン失敗\n"); 50 } 51 //--- ファイルマッピングオブジェクトハンドルの開放 ---// 52 if (NULL != hShareMemory) { 53 printf("共有メモリクローズ\n"); 54 ::CloseHandle(hShareMemory); 55 56 } 57
C#
1コード 2 string mappedName = "ImageAccess"; 3 MemoryMappedFile mmf; 4 try 5 { 6 //--- メモリマップドファイルを開く ---// 7 using (mmf = MemoryMappedFile.CreateNew(mappedName, width * height * 5, MemoryMappedFileAccess.ReadWrite)) 8 { 9 10 //C++側 マップ書き込み ※FilePathを可変的な記述へ変更のこと 11 12 string filePath = "C:\images"; 13 14 int check = RecVideoL(camNo, width, height, fps, filePath, mappedName); 15 //} 16 //--- マップドストリーム作成 マップ操作 ---// 17 using (MemoryMappedViewStream stream = mmf.CreateViewStream()) 18 { 19 20 //C#側 マップデータ読み込み 21 stream.Read(imageArr, 0, sizeof(byte) * width * height * 4); 22 23 //C#側 BMP変換 24 25 ImageConverter imgConv = new ImageConverter(); 26 if (imgConv != null) 27 { 28 Image img = (Image)imgConv.ConvertFrom(imageArr); 29 Bitmap bmp = new Bitmap(img); 30 //PictureBoxへの表示 31 CameraImg.Image = bmp; 32 } 33 } 34 } 35 36 } 37 catch (Exception ex) 38 { 39 MessageBox.Show(ex.Message); 40 this.Close(); 41 }
回答1件
あなたの回答
tips
プレビュー