###前提・実現したいこと
・問題点
Visual StudioでC#とWPFを使ったアプリケーションを作っています。
入力した画像を細線化させるためにメモリの動的確保を行ったソースコードがC++であったので、メモリの動的確保の代わりにbyte[,] imCrrnt = new byte[size.Height + 2,size.Width + 2];のように二次元配列で作ったところうまくいかず、C#でメモリの動的確保を行ったところ下記の imCrrnt[y + 1][x + 1] = imProcd[y + 1][x + 1] = 0; に「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」とエラーが発生してしまいました。
そこで、正しい記述方法でメモリの動的確保を行えていないのではないと考えたのですが、解決方法が見つからずに手詰まりとなっています。
利用ライブラリとしてOpenCVSharpを用いています。
お手数をおかけしますがご教授お願いいたします。
###該当のソースコード
C++
cv::Mat cvHilditch2(const cv::Mat& im_src) { cv::Size size = im_src.size(); unsigned char** im_crrnt; unsigned char** im_procd; im_crrnt = new unsigned char*[size.height + 2]; im_procd = new unsigned char*[size.height + 2]; for (int y = 0; y < size.height + 2; y++) { im_crrnt[y] = new unsigned char[size.width + 2]; im_procd[y] = new unsigned char[size.width + 2]; } for (int y = 0; y < size.height; y++) { for (int x = 0; x < size.width; x++) { int pos = y * (int)im_src.step + x * im_src.channels(); int val = (int)im_src.data[pos]; if (val == 255) im_crrnt[y + 1][x + 1] = im_procd[y + 1][x + 1] = 1; else if (val == 0) im_crrnt[y + 1][x + 1] = im_procd[y + 1][x + 1] = 0; else { exit(1); } } } ・・・・//以下省略
C#で書き直したもの
static unsafe Mat cvHilditch(ref Mat img) { OpenCvSharp.Size size = img.Size(); byte** imCrrnt = stackalloc byte*[size.Height + 2]; byte* imCrrntTmp = stackalloc byte[size.Width + 2]; byte** imProcd = stackalloc byte*[size.Height + 2]; byte* imProcdTmp = stackalloc byte[size.Height + 2]; for (int y = 0; y < size.Height + 2; y++) { imCrrnt[y] = imCrrntTmp; imProcd[y] = imProcdTmp; } for (int y = 0; y < size.Height; y++) { for(int x = 0; x < size.Width; x++) { var val = img.Get<Vec3b>(y, x); if (val[0] == 255) imCrrnt[y + 1][x + 1] = imProcd[y + 1][x + 1] = 1; else if (val[0] == 0) imCrrnt[y + 1][x + 1] = imProcd[y + 1][x + 1] = 0;//ここにエラーが発生 else { //Environment.Exit(1); } } } ・・・・//以下省略
###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2015 Visual C#のWPFアプリケーションを使用
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/05 19:09