c#无法访问已释放的对象异常

问题描述

小弟我用c#做kinect开发,最近在写一个提取深度信息的程序,但是总是得不出想要的结果,要么是出现异常,要么就是得到的结果全都一样。我为这个问题苦恼了很久了就是想不到好的解决方法。namespacekincet_rec{///<summary>///MainWindow.xaml的交互逻辑///</summary>publicpartialclassMainWindow:Window{privateKinectSensor_kinect;privatebyte[]colorPixels1,colorPixels2;List<Image<Bgr,Byte>>VideoArray1=newList<Image<Bgr,Byte>>();List<DepthImageFrame>VideoArray2=newList<DepthImageFrame>();privateWriteableBitmapcolorBitmap,depthBitmap;privateconstintClipmaxframenum=100;privateconstintClipminframenum=120;privateDepthImagePixel[]depthPixels;shortdepth;short[]pixelData;publicintbiaoji;publicMainWindow(){InitializeComponent();}privatevoidWindow_Loaded(objectsender,RoutedEventArgse){foreach(varpotentialSensorinKinectSensor.KinectSensors){if(potentialSensor.Status==KinectStatus.Connected){this._kinect=potentialSensor;break;}}if(null!=this._kinect){this._kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);//Turnonthedepthstreamtoreceivedepthframesthis._kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);//Allocatespacetoputthedepthpixelswe'llreceivethis.depthPixels=newDepthImagePixel[this._kinect.DepthStream.FramePixelDataLength];//Allocatespacetoputthecolorpixelswe'llcreatethis.colorPixels1=newbyte[this._kinect.DepthStream.FramePixelDataLength*sizeof(int)];//Allocatespacetoputthecolorpixelswe'llreceivethis.colorPixels2=newbyte[this._kinect.ColorStream.FramePixelDataLength];//Thisisthebitmapwe'lldisplayon-screenthis.colorBitmap=newWriteableBitmap(this._kinect.ColorStream.FrameWidth,this._kinect.ColorStream.FrameHeight,96.0,96.0,PixelFormats.Bgr32,null);this.depthBitmap=newWriteableBitmap(this._kinect.DepthStream.FrameWidth,this._kinect.DepthStream.FrameHeight,96.0,96.0,PixelFormats.Bgr32,null);//Settheimagewedisplaytopointtothebitmapwherewe'llputtheimagedatathis.ColorImageWindow.Source=this.colorBitmap;this.DepthImageWindow.Source=this.depthBitmap;//Addaneventhandlertobecalledwheneverthereisnewdepthframedatathis._kinect.DepthFrameReady+=this._kinect_DepthFrameReady;this._kinect.ColorFrameReady+=this._kinect_ColorFrameReady;//Startthesensor!try{this._kinect.Start();}catch(IOException){this._kinect=null;}}}privatevoidWindowClosing(objectsender,System.ComponentModel.CancelEventArgse){if(null!=this._kinect){this._kinect.Stop();}}privatevoid_kinect_ColorFrameReady(objectsender,ColorImageFrameReadyEventArgse){using(ColorImageFramecolorFrame=e.OpenColorImageFrame()){if(colorFrame!=null){//CopythepixeldatafromtheimagetoatemporaryarraycolorFrame.CopyPixelDataTo(this.colorPixels2);//VideoArray1.Add(colorFrame.ToOpenCVImage<Bgr,Byte>());//Writethepixeldataintoourbitmapthis.colorBitmap.WritePixels(newInt32Rect(0,0,this.colorBitmap.PixelWidth,this.colorBitmap.PixelHeight),this.colorPixels2,this.colorBitmap.PixelWidth*sizeof(int),0);}}}privatevoid_kinect_DepthFrameReady(objectsender,DepthImageFrameReadyEventArgse){using(DepthImageFrameDFrame=e.OpenDepthImageFrame()){if(DFrame!=null){DFrame.CopyDepthImagePixelDataTo(this.depthPixels);intminDepth=DFrame.MinDepth;intmaxDepth=DFrame.MaxDepth;this.pixelData=newshort[_kinect.DepthStream.FramePixelDataLength];DFrame.CopyPixelDataTo(pixelData);intcolorPixelIndex=0;VideoArray2.Add(DFrame);for(inti=0;i<this.depthPixels.Length;i++){depth=depthPixels[i].Depth;byteintensity=(byte)(depth>=minDepth&&depth<=maxDepth?depth:0);//Writeoutbluebytethis.colorPixels1[colorPixelIndex++]=intensity;//Writeoutgreenbytethis.colorPixels1[colorPixelIndex++]=intensity;//Writeoutredbytethis.colorPixels1[colorPixelIndex++]=intensity;++colorPixelIndex;}this.depthBitmap.WritePixels(newInt32Rect(0,0,this.depthBitmap.PixelWidth,this.depthBitmap.PixelHeight),this.depthPixels,this.depthBitmap.PixelWidth*sizeof(int),0);}}}privatevoidColorImage_ImageFailed(objectsender,ExceptionRoutedEventArgse){}privatevoidDepthImage_ImageFailed(objectsender,ExceptionRoutedEventArgse){}privatevoidrecbtn_Click(objectsender,RoutedEventArgse){StringBuildersb=newStringBuilder();stringmyprint="";foreach(vardframeinVideoArray2){short[]pixelData=newshort[_kinect.DepthStream.FramePixelDataLength];dframe.CopyPixelDataTo(pixelData);for(inti=0;i<pixelData.Length;i+=dframe.BytesPerPixel){//myprint=depthPixels[i].Depth.ToString()+"";vardepth=pixelData[i]>>DepthImageFrame.PlayerIndexBitmaskWidth;myprint=depth.ToString()+"";sb.AppendFormat(myprint);sb.AppendFormat("nr");}for(inti=0;i<this.depthPixels.Length;i++){//depth=depthPixels[i].Depth;myprint=depthPixels[i].Depth.ToString()+"";//myprint=depth.ToString();sb.AppendFormat(myprint);sb.AppendFormat("nr");}FileStreamfs=newFileStream("E:/workspace/data"+biaoji.ToString()+".txt",FileMode.Create);StreamWritersw=newStreamWriter(fs,Encoding.GetEncoding("GB2312"));sw.Write(sb.ToString());sb.Clear();sw.Close();fs.Close();biaoji++;}}}}

我说明一下,我用一个集合videoarray2来保存从摄像头读取的每一帧图像,然后在recbtn_Click里面对每一帧的每一个像素都保存到数组pixelData里面,然后测得数组中每一个像素点的深度值,可是程序总是在执行到dframe.CopyPixelDataTo(pixelData)这里报出异常:无法访问已释放的对象异常DepthImageFrame,如果不在recbtn_Click里面保存数组pixelData,而在打开深度信息流的时候保存,则不会报异常,但是得到的全是一样的结果,这是什么原因呢?我知道坛里里面牛人很多,求大家帮帮忙,分不是很多。谢谢!

解决方案

解决方案二:
不该使用using的不要滥用它。比如说你写using(a=....){......list.Add(a);}

这种代码,你把一个执行过a.dispost()的对象放到list里,后果肯定很惨。
解决方案三:
引用1楼sp1234的回复:

不该使用using的不要滥用它。比如说你写using(a=....){......list.Add(a);}

这种代码,你把一个执行过a.dispost()的对象放到list里,后果肯定很惨。

但是我录制彩色视频的时候,也是将videoarray1.add(a)写在using里面,为什么不会释放掉?
解决方案四:
videoarray1是在using中实例化的吗?如果不是当然不会释放
解决方案五:
把_kinect_DepthFrameReady方法里的using(DepthImageFrameDFrame=e.OpenDepthImageFrame())改成DepthImageFrameDFrame=e.OpenDepthImageFrame();
解决方案六:
你把using去掉试试,我也认为是using的问题,出了using作用域DFrame就被释放掉了
解决方案七:
同1楼,不理解using是什么,不要乱用.先整明白using()是起什么作用的

时间: 2024-09-06 12:37:38

c#无法访问已释放的对象异常的相关文章

无法访问已释放的对象 form2

问题描述 privatevoidbutton1_Click_1(objectsender,EventArgse){Form2.Show();this.Visible=true;} 解决方案 解决方案二:问题很清楚,在你show之前,from2已经被释放了,检查其他页面有关from2的操作解决方案三:Form2fm=newForm2();fm.Show();解决方案四:检查有没有执行过Form2的Close方法,或者点击过From2右上角的"X"按钮解决方案五:up..up..解决方案六

尝试访问已卸载的 AppDomain。 (异常来自 HRESULT:0x80131014)

问题描述 用了一个第三方的组件,vs里面可以运行,IIS下运行就报错了.[求解]说明:执行当前Web请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息.异常详细信息:System.AppDomainUnloadedException:尝试访问已卸载的AppDomain.(异常来自HRESULT:0x80131014)源错误:行24:content.Append(@"翻译说明:语音识别中重点翻译"命令识别"[Commandrec

“不能执行已释放的Script代码”错误的原因及解决办法_javascript技巧

很多web开发者或许都遇到过这样的问题,程序莫名奇怪出现"不能执行已释放Script的代码",错误行1,列1.对于这种消息描述不着边,行列描述更是让人迷茫的js错误,相信是所有调试js程序的朋友们最郁闷也最憎恨的事情!遇到这种问题,最简单的办法直接把错误贴到baidu或google那个小输入框中让他们先给点指点,再去解决,可这次却没有这么容易,在baidu搜索似乎很多人都遇到过这种问题,但是都是些什么qq空间错误,狂晕,或者就是只有问没有答的,闷!    这种错误从何调起?后面没办法,

项目中使用System.Threading.Timer对象时IIS释放Timer对象的问题

之前的一个项目中使用System.Threading.Timer对象时有没有遇到IIS释放Timer对象的问 题.说实话之前真没遇到过这个问题,就是说我之前定义的timer对象没有释放,运行正常, 回来后我就百度寻找这方面得信息,原来IIS在运行WebApp时对于非静态资源都是自动释放, 而我回头看了看之前写的Web程序,很幸运当时是这么写的: Global.asax文件 private static Timer time; //System.Threading; private static

.net-我在做文件上传的时候,但是上传大文件的时候就出现“无法访问已关闭的文件”错误

问题描述 我在做文件上传的时候,但是上传大文件的时候就出现"无法访问已关闭的文件"错误 我在做.net文件上传的时候,一次性能上传好几个的那种,但是每次上传小的文件的时候都能成功,如果上传较大一点的文件的时候就会出现"无法访问已关闭的文件"的错误,我不知道是什么情况,而且我把文件上传的最大设置成100M都不行,哪位大神级人物能不能帮帮忙解答一下!!!小女子这厢有理了!!!

在scala中,类和它的伴生对象可以相互访问对方的私有对象

在scala中,类和它的伴生对象可以相互访问对方的私有对象 class Person {   private var _age = 2   def age_=(num: Int) = this._age = num   def age = _age   def printObj { println(s"I can see ${Person.obj}") } } object Person {   // access the private class field 'age'   def

私有变量-jsp页面可以访问javabean的private对象?

问题描述 jsp页面可以访问javabean的private对象? 今天看struts2时,遇到一个问题如下: 1:在jsp页面时给一个button控件赋value值时使用struts2标签user.username. 2:在EL表达式中也使用user.username来访问 问题是user是javabean对象,username是user的私有成员.为什么可以直接用对象来访问私有成员呢?不是应该使用user的getUsername()方法吗? 解决方案 这是Struts2框架的一个优点,支持对

springmvc-用Hibernate集合SpringMVC做的查询所有记录,在访问jsp时就报异常了

问题描述 用Hibernate集合SpringMVC做的查询所有记录,在访问jsp时就报异常了 主要异常: org.apache.jasper.JasperException: /customer/cust_list.jsp(10,2) Expecting "jsp:param" standard action with "name" and "value" attributes org.apache.jasper.compiler.Defaul

《Android应用开发攻略》——2.3 作为“单例”访问Android应用程序对象

2.3 作为"单例"访问Android应用程序对象 Adrian Cowham2.3.1 问题 你需要从Android应用程序中访问"全局"数据.2.3.2 解决方案 最好的解决方案是子类化android.app.Application,把它作为一个有静态存取方法的单例处理.每个Android应用在生命周期中都有一个android.app.Application实例.如果选择子类化android.app.Application,Android将创建类的一个实例,并在