DOBON.NETプログラミング道掲示板

■34731 / 親記事)  USBカメラをピクチャボックスに表示
  
□投稿者/ はる 一般人(1回)-(2021/05/22(Sat) 22:58:01)
  • アイコン環境/言語:[Windows10 VisualStudio2019 c# Framework4.8] 
    分類:[.NET] 

    初めて投稿します。
    OpenCvSharp4を使用してUSBカメラをピクチャボックスに表示するプロクラムを作成しています。

    1280×720は表示できるんですが、これ以上サイズをあげると
    「 graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows); の行で
    保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。'」のエラーが表示されます。
    いろいろ調べてみたのですが原因がわからず。

    詳しい方いらっしゃいましたら教えて頂けないでしょうか?
    宜しくお願い致します。



    int WIDTH = 1280;
    int HEIGHT = 720;
    Mat frame = new Mat();
    VideoCapture capture = new VideoCapture();
    Bitmap bmp ;
    Graphics graphic;

    private void OpenCv()
    {
    //カメラ画像取得用のVideoCapture作成
    capture = new VideoCapture(0);
    if (!capture.IsOpened())
    {
    MessageBox.Show("使用できるカメラがありません。");
    return;
    }
    capture.FrameWidth = WIDTH;
    capture.FrameHeight = HEIGHT;

    frame = new Mat(HEIGHT, WIDTH, MatType.CV_8UC3);

    bmp = new Bitmap(frame.Cols, frame.Rows, (int)frame.Step(), System.Drawing.Imaging.PixelFormat.Format24bppRgb, frame.Data);

    PicOpenCv.Width = frame.Cols;
    PicOpenCv.Height = frame.Rows;

    graphic = PicOpenCv.CreateGraphics();

    BgWorker.RunWorkerAsync();
    }

    private void BgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows);
    }

    private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
    BackgroundWorker bw = (BackgroundWorker)sender;

    while (!BgWorker.CancellationPending)
    {
    capture.Grab();
    OpenCvSharp.Internal.NativeMethods.videoio_VideoCapture_operatorRightShift_Mat(capture.CvPtr, frame.CvPtr);
    bw.ReportProgress(0);
    }
    }

マルチポストを報告
違反を報告
引用返信 削除キー/
■34732 / ResNo.1)  Re[1]: USBカメラをピクチャボックスに表示
□投稿者/ 魔界の仮面弁士 大御所(1334回)-(2021/05/23(Sun) 12:04:49)
  • アイコンNo34731に返信(はるさんの記事)
    > 他のメモリが壊れていることが考えられます。'」のエラーが表示されます。
    フィールド変数である private Mat frame; が
    UI スレッドと作業スレッドの双方で共有されている点が気になりました。

    スレッドを跨がないよう、ローカル変数で処理されては如何でしょう。

    たとえば、ReportProgress の第二引数に対して、
    frame.Cols と frame.Rows の 2 つを(int[]、Size、Point、Recangle 等で)渡し、
    それを ProgressChanged 時に e.UserState から受け取って使うとか。


    > OpenCvSharp4を使用してUSBカメラをピクチャボックスに表示するプロクラムを作成しています。

    VideoCapture だとカメラ指定がインデックス管理のみだったので、
    複数のカメラ(内蔵前面カメラ、内蔵背面カメラ、外部USBカメラなど)の指定が
    しにくかったり、USB ポートを変えると番号がズレることがあって
    個人的にはあまり使わなくなってしまいました。
    (最近は、AForge.Video.DirectShow で撮影)
違反を報告
引用返信 削除キー/
■34734 / ResNo.2)  Re[2]: USBカメラをピクチャボックスに表示
□投稿者/ はる 一般人(3回)-(2021/05/23(Sun) 13:57:42)
  • アイコン魔界の仮面弁士さん。ありがとうございます。

    No34732に返信(魔界の仮面弁士さんの記事)
    > ■No34731に返信(はるさんの記事)
    >>他のメモリが壊れていることが考えられます。'」のエラーが表示されます。
    > フィールド変数である private Mat frame; が
    > UI スレッドと作業スレッドの双方で共有されている点が気になりました。
    >
    > スレッドを跨がないよう、ローカル変数で処理されては如何でしょう。

    試してみましたが、同じエラーでした。
     サイズを大きくしても、
    > graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows);
     のframe.ColsとRowsが1280×720になります。

    > frame = new Mat(HEIGHT, WIDTH, MatType.CV_8UC3); MatType.CV_8UC3にしてるのが原因かなとは思うのですが詳細な説明が見つけれず。。

    >(最近は、AForge.Video.DirectShow で撮影)
    は初めて聞きました。検索して出てきたのがOpenCvだったので。
    これも調べてみます。

      
違反を報告
引用返信 削除キー/
■34735 / ResNo.3)  Re[2]: USBカメラをピクチャボックスに表示
□投稿者/ はる 一般人(5回)-(2021/05/23(Sun) 16:20:14)
  • アイコン魔界の仮面弁士さん
    > (最近は、AForge.Video.DirectShow で撮影)

    ものすごく簡単でした。
    こちらに切り替えます。ありがうございました。
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -