不要把这么大的数据量的图片一次读到内存中,比如你可以创建一个4M的内存,每次只读几张图片的2进制数据这相当于cache

解决方案 »

  1.   

    image.GetPixelPtr(i , j) 是从那么来的? 它的原型是什么?有一点可以注意是C#的char不是C++的char。C#的byte才相当于C++的unsigned char。
    C#的char占两个字节,C++的char占一个字节。
      

  2.   

        for(int g = 0; g < cc; g++) 
                        { 
                            pimage[i * ww * cc + j * cc + g] = 
                                  (char)(*(image.GetPixelPtr(i , j)+g) ); 
                  
                        } 
    你仔细检查下这句,一般再大也不提示到内存益处的
    很有可能是是你索引或者其它超出。
      

  3.   

    char 是值类型 ,GC管不到吧?
      

  4.   

    我在一段代码的时候调用了C++Dll中的一个函数,初始化dll中的对象,然后占掉500多m然后再timer_tick下的代码来调用我dll中函数前用上面这个char[] 将CVImage image处理成数组形式当参数传递到C++Dll中。
    image.GetPixelPtr(i , j) 是OpenCV中的CVImage类型的函数。在timer_tick运行过程中,内存占用越来越大,然后Out of Memory!
      

  5.   

    是char数组,数组是引用类型的
      

  6.   

    这个不是很大! 我刚调了下,不好意思,这里没用多少内存。是其他地方,如我调dll函数时!
      

  7.   

    我认为这个c++ dll本身处理上就有问题。这么大的数据量应该使用类型与分页的方式来做
      

  8.   


    1、CVImage倒是可以支持每通道16bit的图像,不过绝大部分图像的每个颜色是8bit的,是一个C#byte,不是char。
    2、有什么特殊原因要把image的像素读到数组中呢?直接用不行吗?特别在timer_tick这种重复调用的情况下,要比较小心。
      

  9.   

    我吧CVImage当参数在C#和C++中传递,不认。C#中的CVImage是从网上找的OpenCV的C#版,可能写的不一样。只好通过数组来传递图像。timer_tick的interval设成视频每帧的时间,每一帧我在timer_tick下处理。现在问题是初始化的时候占用500m内存,然后再timer_tick时内存不断增长,然后Out of Memory!
      

  10.   

    记得释放资源!无论是DLL还是程序。仔细检查下,如果是跨DLL调用,可能需要手工释放,具体我也没有碰到过。
      

  11.   

    CVImage类型的对象如何释放啊?CVImage::Dispose();可以释放掉吗?我在Timer_Tick()中new了一个CVImage的对象,然后就狂占内存。
      

  12.   

    你可以创建一个4M的内存,每次只读几张图片的2进制数据这相当于cache.顺便帮你顶一下吧。