Visual c++ C+中的局部二进制模式+;

Visual c++ C+中的局部二进制模式+;,visual-c++,c++-cli,Visual C++,C++ Cli,我对此代码有问题:private: private: System::Void lBPToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { int ** YP; Bitmap ^ bmpPictureLBP = gcnew Bitmap(W, H); int vn[2][8] = { { 0, 1, 1, 1, 0, -1,

我对此代码有问题:private:

private: System::Void lBPToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
             int ** YP;  
             Bitmap ^ bmpPictureLBP = gcnew Bitmap(W, H);
            int vn[2][8] = { { 0, 1, 1, 1, 0, -1, -1, -1 },
             { 1, 1, 0, -1, -1, -1, 0, 1 } };

             YP = new int*[W];
             for (int i = 0; i < W; i++)
             {
                 YP[i] = new int[H];
                 for (int j = 0; j < H; j++)
                 {

                     for (int k = 0; k < 8; k++)
                     for (int l = 0; k < 8; k++)

                         YP[i][j] = Y[i + vn[1][k]][j +vn[2][l]];


                     bmpPictureLBP->SetPixel(i, j, Color::FromArgb(YP[i][j], YP[i][j], YP[i][j]));
                 }
             }
private:System::Void lBPToolStripMenuItem\u单击(系统::对象^sender,系统::事件参数^e){
int**YP;
位图^bmpPictureLBP=gc新位图(W,H);
int vn[2][8]={{0,1,1,1,0,-1,-1,-1},
{ 1, 1, 0, -1, -1, -1, 0, 1 } };
YP=新整数*[W];
对于(int i=0;iSetPixel(i,j,Color::FromArgb(YP[i][j],YP[i][j],YP[i][j]);
}
}
有人能帮我吗? 首先不会出现错误,但调试后,他们告诉我“指示顺序内存已损坏”,并在自动窗口中显示红色:+YP[i]0x0669AFB0 int*

我看到几个问题:

for (int k = 0; k < 8; k++)
for (int l = 0; k < 8; k++)
  • 您已将
    vn
    声明为大小为2的数组,这意味着数组索引为0和1。您正在访问数组索引1和2;您正在离开数组的末尾
  • 您正在访问附近各种索引的
    YP
    :i+1、i-1、j+1、j-1。
    • 您还没有初始化
      YP[i+1]
      ,直到for循环的下一次迭代才进行初始化
    • 您没有进行范围检查:如果
      i
      j
      为0怎么办?您将访问
      YP[-1]
      YP[i][1]
      ,两者都无效
最后,对该算法进行评论:您正在反复修改
YP[i][j]
,但没有保存上次的结果。如图所示,您的模糊算法只需复制像素
YP[i-1][j+1]
,有效地将图像向右上方移动一个像素。(也许您有正确混合像素的代码,但您没有将其复制到web。)

int vn[2][8] = { { 0, 1, 1,  1,  0, -1, -1, -1 },
                 { 1, 1, 0, -1, -1, -1,  0,  1 } };

YP[i][j] = Y[i + vn[1][k]][j +vn[2][l]];