ushort d = mDepth.ptr<ushort>(m)[n];和float depth = depthMap.at<float>(v, u);的区别是什么?
时间: 2024-04-18 21:26:13 浏览: 72
这两行代码的区别在于数据类型和使用方式1. `ushort d = mDepth.ptr<ushort>(m)[n];` 这行代码使用了OpenCV库中的`ptr()`方法和`[]`运算符,用于访问一个二维数组(或矩阵)中的某个元素。`mDepth`是一个二维数组(或矩阵),`ptr<ushort>(m)`返回指向第m行数据的指针,然后使用`[n]`来访问第m行中的第n个元素。`ushort`是无符号短整型数据类型。这行代码适用于访问OpenCV中的深度图像数据,例如从Kinect设备获取的深度图像。
2. `float depth = depthMap.at<float>(v, u);` 这行代码使用了OpenCV库中的`at()`方法,用于访问一个多维数组(或矩阵)中的某个元素。`depthMap`是一个多维数组(或矩阵),`at<float>(v, u)`返回第v行、第u列的元素值。`float`是单精度浮点型数据类型。这行代码适用于访问OpenCV中的其他类型的图像数据,例如灰度图像或彩色图像。
总结:区别在于数据类型和使用方式。第一行代码使用了`ptr()`和`[]`来访问二维数组中的元素,数据类型为`ushort`;而第二行代码使用了`at()`来访问多维数组中的元素,数据类型为`float`。具体使用哪一种方式取决于所处理的数据类型和库的要求。
相关问题
string regAddr = dgvData.Rows[e.RowIndex].Cells["colRegNum"].Value.ToString(); //modbus地址 ushort uRegAddr = (ushort)Convert.ToInt16(regAddr); string regValue = ""; if (dgvData.Rows[e.RowIndex].Cells["colRegValue"].Value != null) { regValue = dgvData.Rows[e.RowIndex].Cells["colRegValue"].Value.ToString(); regValue = GetGridValue(regAddr, regValue).ToString(); } double dRegValue = 0; if (regValue.Trim() != "") { dRegValue = Convert.ToDouble(regValue); } if (e.ColumnIndex == dgvData.Columns["colRead"].Index) { if (SendReadCmd(uRegAddr)) { int pos = (int)Math.Log10(modCmd.objRegDicionary[uRegAddr].Gain); string format = "f" + pos.ToString(); string strValue = modCmd.objRegDicionary[uRegAddr].regValue.ToString(); if (pos > 0) { strValue = modCmd.objRegDicionary[uRegAddr].regValue.ToString(format); } if (IsSwitchReg(regAddr)) { if (strValue == "1") { strValue = "ON"; } else { strValue = "OFF"; } }
在这段代码中,它首先从所选行中获取modbus地址并将其转换为ushort类型,就像之前的代码片段一样。接着,它会检查所选行中“colRegValue”列的值是否为空,如果不为空,就会调用GetGridValue方法来获取该值,并将其转换为字符串类型。
然后,它会将获取到的字符串类型的值转换为double类型,并将其存储在dRegValue变量中。接下来,它会检查用户是否点击了“colRead”列。如果是,它会调用SendReadCmd方法向modbus设备发送读取命令,并从modCmd.objRegDicionary[uRegAddr]中获取到读取到的寄存器值。然后,它会将该值格式化成字符串,并将其存储在strValue变量中。如果该寄存器是开关寄存器,它会将值“1”转换为“ON”,将值“0”转换为“OFF”。
总之,这段代码的作用是在用户单击“colRead”列时,向modbus设备发送读取命令,并将读取到的寄存器值在DataGridView中显示出来。
void MainWindow::on_pushButton_clicked() { mlabel mlabel1; //读取raw FILE* fp = fopen("E:\\QTprogram\\ImageProcess001\\Rad Image1.raw","rb");//读取图片 unsigned int size = width * hight; ushort* raw_data = (unsigned short*)calloc(size,sizeof (unsigned short)); fread(raw_data,sizeof (unsigned short),size,fp);//读取图像内部数据 free(fp); QImage img(width,hight,QImage::Format_Grayscale16);//转换图像 // for(int i=0;i<width;i++) // { // for(int j=0;j<hight;j++) // { // uint pixelval = raw_data[i+j*width]; // QRgb color = qRgb(pixelval, pixelval, pixelval); // img.setPixel(i,j, color); // } // } uint P1= 0,P2= 0,P3= 0,P4= 0,Pc= 0,P5= 0,P6= 0,P7= 0,P8 = 0; // uint Dh1= 0,Dh2= 0,Dh3= 0; // uint Dv1= 0,Dv2= 0,Dv3= 0; // uint D45_1= 0,D45_2= 0,D45_3= 0; // uint D135_1= 0,D135_2= 0,D135_3= 0; // uint Ary[]={}; QVector<QVector<uint>>Raw_Pixelval; QVector<QVector<uint>>Prc_Pixelval; // int &pRPixelval; for (int i=0;i<width;i++)//获取原始像素灰度值 { for(int j=0;j<hight;j++) { uint pixelval = raw_data[i+j*width]; Raw_Pixelval[i][j] = pixelval; } } for (int i=0;i<width;i++) { for(int j=0;j<hight;j++) { P1 = Raw_Pixelval[i-1][j-1]; P2 = Raw_Pixelval[i-1][j]; P3 = Raw_Pixelval[i-1][j+1]; P4 = Raw_Pixelval[i][j-1]; Pc = Raw_Pixelval[i][j]; P5 = Raw_Pixelval[i][j+1]; P6 = Raw_Pixelval[i+1][j-1]; P7 = Raw_Pixelval[i+1][j]; P8 = Raw_Pixelval[i+1][j+1]; uint Radio_c9[9]={P1,P2,P3,P4,Pc,P5,P6,P7,P8}; uint median_Dh = mlabel1.median(Radio_c9,3); Prc_Pixelval[i][j] = median_Dh; // uint MaxRadio_c9 = mlabel1.MAX(Radio_c9); // uint MinRadio_c9 = mlabel1.MIN(Radio_c9); } } for (int i=0;i<width;i++) { for(int j=0;j<hight;j++) { uint pixelval = Prc_Pixelval[i][j]; QRgb color = qRgb(pixelval, pixelval, pixelval); img.setPixel(i,j, color); } } QPixmap px = QPixmap::fromImage(img); free(raw_data); label->setPixmap(px); label->show(); }
这段代码是用来读取一张RAW格式的图像,然后进行中值滤波去噪,并显示处理后的图像。具体来说,它先打开一个RAW图像文件,然后将图像数据读入一个内存块中。接着,它将原始像素灰度值存储到一个二维的QVector中,然后对每个像素进行中值滤波处理,将处理后的像素值存储到另一个二维的QVector中。最后,它将处理后的图像显示在一个QLabel控件中。
阅读全文