当前位置: 首页 > 编程语言 > C#

如何获取和设置EmguCVMat图像的像素值?分享

时间:2023-04-11 10:33:09 C#

EmguCVMat图像的像素值如何获取和设置?我正在使用EmguCV3.0.0包装器访问OpenCV3.0库。我在几个地方使用Mat类。这是一个由双值组成的单通道8×8图像的示例:Matimage=newMat(8,8,DepthType.Cv64F,1);Image类提供了合理的获取和设置像素值的方法,这个方法对于Matrix类也是有用的,但是对于Mat类来说似乎不是很明显。我弄清楚如何设置单个像素的唯一方法是使用掩码://设置两个像素值,(0,0)到9.0,(2,3)到42.0Matrixmask=newMatrix(8,8);面具。数据[0,0]=1;image.SetTo(新MCvScalar(9.0),掩码);面具=新矩阵(8,8);mask.Data[2,3]=1;image.SetTo(新MCvScalar(42.0),掩码);感觉应该是两行,而不是六行,所以我想我漏掉了什么。当Mat有多个通道时事情会变得更复杂,因为Matrix只是2D,所以必须使用掩码来设置每个通道上的像素。我没有时间或内存以这种方式设置像素。如何使用单个方法调用设置像素?您可以通过使用DataPointer复制非托管内存块并将托管类型转换为非托管类型来从Mat获取元素。设定点按相反方向分组。例如,您可以使用这种扩展类型publicstaticclassMatExtension{publicstaticdynamicGetValue(thisMatmat,introw,intcol){varvalue=CreateElement(mat.Depth);Marshal.Copy(mat.DataPointer+(row*mat.Cols+col)*mat.ElementSize,value,0,1);返回值[0];}publicstaticvoidSetValue(thisMatmat,introw,intcol,dynamicvalue){vartarget=CreateElement(mat.Depth,value);Marshal.Copy(target,0,mat.DataPointer+(row*mat.Cols+col)*mat.ElementSize,1);}privatestaticdynamicCreateElement(DepthTypedepthType,dynamicvalue){varelement=CreateElement(depthType);元素[0]=值;返回元素;}privatestaticdynamicCreateElement(DepthTypedepthType){if(depthType==DepthType.Cv8S){returnnewsbyte[1];}if(depthType==DepthType.Cv8U){returnnewbyte[1];}if(depthType==DepthType.Cv16S){returnnewshort[1];}if(depthType==DepthType.Cv16U){returnnewushort[1];}if(depthType==DepthType.Cv32S){ret瓮新int[1];}if(depthType==DepthType.Cv32F){returnnewfloat[1];}if(depthType==DepthType.Cv64F){returnnewdouble[1];}返回新的浮动[1];然后使用单个方法调用varrow=2;获取和设置值;变量col=1;varmat=newMat(3,3,DepthType.Cv64F,3);mat.SetValue(行,列,3.14);varvalue=mat.GetValue(row,col);200000000次操作的测试表明动态类型版本比静态版本慢~2.5倍publicstaticdoubleGetDoubleValue(thisMatmat,introw,intcol){varvalue=newdouble[1];Marshal.Copy(mat.DataPointer+(row*mat.Cols+col)*mat.ElementSize,value,0,1);返回值[0];}publicstaticvoidSetDoubleValue(thisMatmat,introw,intcol,doublevalue){vartarget=new[]{value};Marshal.Copy(target,0,mat.DataPointer+(row*mat.Cols+col)*mat.ElementSize,1);}基于BartoszRachwal的优秀回答,我尝试为OpenCvSharp编写:以上是C#学习教程:HowtogetandsetthepixelvalueofEmguCVMatimage?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——publicstaticdynamicGetValue(thisMatmat,introw,intcol){varvalue=CreateElement(mat.Type());Marshal.Copy(mat.Data+(row*mat.Cols+col)*mat.ElemSize(),value,0,1);返回值[0];}publicstaticvoidSetValue(thisMatmat,introw,intcol,dynamicvalue){vartarget=CreateElement(mat.Type(),value);Marshal.Copy(target,0,mat.Data+(row*mat.Cols+col)*mat.ElemSize(),1);}私有静态动态CreateElement(MatTypedepthType,动态值){varelement=CreateElement(depthType);元素[0]=值;返回元素;}privatestaticdynamicCreateElement(MatTypedepthType){switch(depthType){caseMatType.CV_8S:returnnewsbyte[1];caseMatType.CV_8U:返回新字节[1];caseMatType.CV_16S:returnnewshort[1];caseMatType.CV_16U:returnnewushort[1];caseMatType.CV_32S:返回新的int[1];caseMatType.CV_32F:returnnewfloat[1];caseMatType.CV_64F:returnnewdouble[1];默认值:抛出新的NotImplementedException();点击右侧联系管理员删除。如需转载请注明出处: