C ++中的本地二进制模式

时间:2015-03-28 10:30:00

标签: 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, -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]));
                 }
             }

有谁可以帮助我? 几乎没有出现错误,但经过调试他们告诉我一个&#34;指示内存已损坏&#34;,并且在Autos窗口中显示红色:+ YP [i] 0x0669AFB0 int *。

1 个答案:

答案 0 :(得分:0)

我看到几个问题:

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

我假设这是一个拼写错误,第二个for循环应该使用l执行更多操作。

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]];
  • 您已将vn声明为大小为2的数组,这意味着数组索引为0和1.您正在访问数组索引1和2;你已经离开了阵列的末尾。
  • 您在附近的各个索引处访问YP:i + 1,i-1,j + 1,j-1。
    • 您还没有初始化YP[i+1],在完成for循环的下一次迭代之前,您不会这样做。
    • 您无法检查任何内容:如果ij为0,该怎么办?您将访问YP[-1]YP[i][-1],两者均无效。

最后,对算法发表评论:您反复修改YP[i][j],但是您没有保存上次的结果。如图所示,您的模糊算法将简单地复制像素YP[i-1][j+1],从而有效地将图像移动到右上角一个像素。 (也许你的代码可以正确地混合像素,你只是没有将它复制到网上。)