Beispiel #1
0
        /// <summary> ViewModelの値を構造体に代入 </summary>
        public static SetImageStruct GetSettingStruct(CamViewAreaDVModel data)
        {
            var setStruct = new SetImageStruct
            {
                HasToUndistort  = data.HasToUndistort,
                OutputWidth     = data.OutputWidth,
                OutputHeight    = data.OutputHeight,
                Threshold1      = data.Threshold1,
                Threshold2      = data.Threshold2,
                Threshold       = data.Threshold,
                RhoResolution   = data.RhoResolution,
                ThetaResolution = data.ThetaResolution,
                MinLineLength   = data.MinLineLength,
                MaxLineGap      = data.MaxLineGap,
                Torelance       = data.Torelance,
                LowerThetaLimit = data.LowerThetaLimit,
                HasToMask       = data.HasToMask,
                X1        = data.X1,
                Y1        = data.Y1,
                RecWidth  = data.RecWidth,
                RecHeight = data.RecHeight,
                KSizeX    = data.KSizeX,
                KSizeY    = data.KSizeY,
                SigmaX    = data.SigmaX,
                SigmaY    = data.SigmaY,
            };

            return(setStruct);
        }
Beispiel #2
0
        /// <summary> 送信用のバイト配列を取得する </summary>
        /// <param name="judgStr">ヘッダー判定子</param>
        /// <param name="sStruct">構造体</param>
        /// <returns></returns>
        public static byte[] StructToByte(string judgStr, SetImageStruct sStruct)
        {
            //ヘッダー:判定部
            var headJudgBt = Encoding.UTF8.GetBytes(judgStr);

            //ヘッダー:サイズ
            var headSizeInt = Marshal.SizeOf(typeof(SetImageStruct));

            //構造体をbyteに変更
            var strBt = new byte[headSizeInt];
            var ptr   = Marshal.AllocHGlobal(headSizeInt);

            Marshal.StructureToPtr(sStruct, ptr, true);
            Marshal.Copy(ptr, strBt, 0, headSizeInt);
            Marshal.FreeHGlobal(ptr);

            var sendByteSizeBt = Encoding.UTF8.GetBytes(headSizeInt.ToString() + ",");
            var tempBt         = headJudgBt.Concat(sendByteSizeBt).Concat(strBt).ToArray();

            return(tempBt);
        }
Beispiel #3
0
        /// <summary> 撮像開始ボタン </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_CamCapture_Click(object sender, RoutedEventArgs e)
        {
            //撮影用パラメータの送信と応答受信
            //キャプチャ番号を取得
            var capNum = (int)Decimal_CapPositon.Value;

            //撮影用パラメータ設定
            if (CheckBox_AutoSettingRead.IsChecked == true)
            {
                //チェックボックスにチェックがある場合はcapNumに対応したファイルを読み込み反映する
                var capParam = paramHangerDir + $@"\Cam001_pos_011_plate_{capNum:D3}_param.xml";
                if (!File.Exists(capParam))
                {
                    //撮影用パラメータが存在しない場合
                    MessageBox.Show($"撮影用パラメータ\n{capParam}\nがありません.作成後、プログラムを再起動してください", "File Missing Error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
                else
                {
                    CamViewAreaDVModel.ReadParamFromXml(capParam);
                }
            }

            //ヘッダー:判定部
            var cmdSendStr = "StructAll";

            //送信用構造体(パラメータ)取得
            var camSettng = SetImageStruct.GetSettingStruct(new CamViewAreaDVModel());

            //送信用バイト配列取得(ヘッダー+送信用構造体)
            var cmdSendStrBt = SetImageStruct.StructToByte(cmdSendStr, camSettng);

            //撮影用パラメータ送信
            SendData(namedPipe, cmdSendStrBt);

            //応答受信
            if (RecvData(namedPipe)[0] != "StructerReceived")
            {
                Trace.WriteLine($"構造体(撮影パラメータ)の送受信に失敗しました", "Error");
                Environment.Exit(2);
            }

            //撮影位置番号と撮像開始信号の送信と応答受信
            //ヘッダー:判定部
            var cmdSendCapStr = string.Format(string.Format(CheckBox_CamUse.IsChecked == false ? $"Capture,{capNum:D3}" : $"OfflineImage,{capNum:D3}"));
            var cmdSendCapBt  = Encoding.UTF8.GetBytes(cmdSendCapStr);

            //撮影位置番号と撮像開始信号送信
            SendData(namedPipe, cmdSendCapBt);

            //応答受信
            if (RecvData(namedPipe)[0] != "SucceedCapture")
            {
                Trace.WriteLine($"撮像中にエラーが発生しました", "Error");
                Environment.Exit(3);
            }

            //撮影位置番号と測定結果要請の送信と応答受信及びに測定結果表示
            //ヘッダー:判定部
            var cmdGetResultStr = "GetMeasureData";

            //送信用バイト配列取得(ヘッダー+送信用構造体)
            var cmdGetResultBt = SetImageStruct.StructToByte(cmdGetResultStr, camSettng);

            //撮影位置番号と定結果要請送信
            SendData(namedPipe, cmdGetResultBt);

            //応答受信
            var resultStrAr = RecvData(namedPipe);

            //richTextに表示
            var paragraph   = new Paragraph();
            var recDetaSize = 0;

            try
            {
                recDetaSize = int.Parse(resultStrAr[1]);
            }
            catch (ArgumentNullException ane)
            {
                Trace.WriteLine("結果受信中にエラーが発生しました", "Error");
                Environment.Exit(4);
            }

            if (recDetaSize == resultStrAr[3].Length)
            {
                var resultStr = resultStrAr[0] + "[" + resultStrAr[2] + "]" + "Coordinates" + "[" + resultStrAr[3] + "]";
                paragraph.Inlines.Add(resultStr);
                RichTextBox_Result.Document.Blocks.Add(paragraph);
            }
            else
            {
                Trace.WriteLine("受信した結果のサイズ情報に誤りがあります", "Error");
                Environment.Exit(5);
            }

            //撮影位置番号と編集画像の要請と画像の受信
            //ヘッダー:判定部
            var cmdGetImgStr = "GetImage";

            //送信用バイト配列取得(ヘッダー+送信用構造体)
            var cmdGetImgBt = SetImageStruct.StructToByte(cmdGetImgStr, camSettng);

            //撮影位置番号と定結果要請送信
            SendData(namedPipe, cmdGetImgBt);

            //受信用のバッファサイズ取得
            var imgBytes = new byte[namedPipe.InBufferSize];
            var rCnt     = namedPipe.Read(imgBytes, 0, imgBytes.Length); //受信

            //Byte->画像変換
            var imgStrAr = RecvData(namedPipe);
            var imgStr   = string.Empty;
            var imgSize  = 0;
            var imgWidth = 0;
            var imgHeigh = 0;

            try
            {
                imgStr   = imgStrAr[0];
                imgSize  = int.Parse(imgStrAr[1]);
                imgWidth = int.Parse(imgStrAr[2]);
                imgHeigh = int.Parse(imgStrAr[3]);
            }
            catch (Exception ex)
            {
                Trace.WriteLine("画像の変換中にエラーが発生しました", "Error");
                Environment.Exit(6);
            }

            //byte->画像生成->Xamlに表示
            if (imgStr == "Image")
            {
                var imgRawBtAr = new byte[imgSize];
                Buffer.BlockCopy(imgBytes, rCnt - imgSize, imgRawBtAr, 0, imgSize); //bmp rawを取得する

                var bitmapImg = new BitmapImage();

                var bmp = ByteArrayToImage(imgRawBtAr, imgWidth, imgHeigh);
                var ms  = new MemoryStream();
                bmp.Save(ms, ImageFormat.Bmp);
                ms.Position = 0;
                bitmapImg.BeginInit();
                bitmapImg.CacheOption  = BitmapCacheOption.OnLoad;
                bitmapImg.StreamSource = ms;
                bitmapImg.EndInit();
                bitmapImg.Freeze();

                ImageView.Source = bitmapImg;
            }
            else
            {
                Trace.WriteLine($"撮像に失敗しました.", "Error");
                Environment.Exit(7);
            }
        }