opencv getmat
时间: 2023-09-22 09:14:43 浏览: 109
`getMat()` 是 OpenCV 中 `Mat` 数据结构的方法,它用于获取 `Mat` 对象的底层矩阵数据。这个方法返回一个指向 `Mat` 对象底层数据的指针,并提供了对数据的读写访问权限。如果你想读取或修改 `Mat` 对象的像素值,就需要使用 `getMat()` 方法来获取底层数据指针。需要注意的是,使用 `getMat()` 方法获取的指针不应该被手动释放,因为 `Mat` 对象会在销毁时自动释放底层数据。
相关问题
opencv filter2D源码
以下是 OpenCV 中 `cv::filter2D` 函数的简化版源码:
```cpp
void cv::filter2D(
InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor = Point(-1,-1),
double delta = 0,
int borderType = BORDER_DEFAULT
) {
// 获取输入图像和卷积核
Mat srcMat = src.getMat();
Mat kernelMat = kernel.getMat();
// 创建输出图像
dst.create(srcMat.size(), CV_MAKETYPE(ddepth, srcMat.channels()));
Mat dstMat = dst.getMat();
// 根据卷积核的大小和锚点位置进行卷积计算
Point kernelAnchor(-1, -1);
if (anchor.x >= 0 && anchor.y >= 0)
kernelAnchor = Point(anchor.x * kernelMat.cols, anchor.y * kernelMat.rows);
else
kernelAnchor = Point((kernelMat.cols - 1) / 2, (kernelMat.rows - 1) / 2);
// 对输入图像进行卷积计算
for (int i = 0; i < srcMat.channels(); ++i) {
// 获取当前通道的输入图像和输出图像
Mat srcChannel = srcMat.channel(i);
Mat dstChannel = dstMat.channel(i);
// 对每个像素进行卷积操作
for (int y = 0; y < srcMat.rows; ++y) {
for (int x = 0; x < srcMat.cols; ++x) {
// 计算当前像素的卷积结果
float sum = 0;
for (int ky = 0; ky < kernelMat.rows; ++ky) {
for (int kx = 0; kx < kernelMat.cols; ++kx) {
int srcX = x + kx - kernelAnchor.x;
int srcY = y + ky - kernelAnchor.y;
if (srcX >= 0 && srcX < srcMat.cols && srcY >= 0 && srcY < srcMat.rows)
sum += srcChannel.at<float>(srcY, srcX) * kernelMat.at<float>(ky, kx);
}
}
dstChannel.at<float>(y, x) = static_cast<float>(sum + delta);
}
}
}
// 边界处理
if (borderType != BORDER_CONSTANT)
copyMakeBorder(dst, dst, kernelAnchor.y, kernelMat.rows - kernelAnchor.y - 1, kernelAnchor.x, kernelMat.cols - kernelAnchor.x - 1, borderType);
}
```
这是一个简化版的源码,省略了一些参数的处理和错误检查等细节。如果你想获得更完整和详细的源码,建议直接查阅 OpenCV 的源代码库中的 `imgproc/src/filter.cpp` 文件。
希望对你有帮助!
opencvsharp图像质量评价
OpenCVSharp提供了一些图像质量评价的方法,可以用于评估图像的清晰度、对比度等指标。以下是一些常用的方法:
1. Laplacian算子评价图像清晰度
```csharp
using OpenCvSharp;
Mat src = Cv2.ImRead("image.jpg", ImreadModes.Grayscale);
Mat laplacian = new Mat();
Cv2.Laplacian(src, laplacian, MatType.CV_64F);
Scalar mean, stddev;
Cv2.MeanStdDev(laplacian, out mean, out stddev);
double focusMeasure = stddev.Val0 * stddev.Val0;
```
2. 傅里叶变换评价图像清晰度
```csharp
using OpenCvSharp;
Mat src = Cv2.ImRead("image.jpg", ImreadModes.Grayscale);
Mat padded = new Mat();
Cv2.CopyMakeBorder(src, padded, 0, src.Rows, 0, src.Cols, BorderTypes.Constant, Scalar.All(0));
padded = padded.Norm(NormTypes.MinMax);
Mat planes = new MatArray(padded, Mat.Zeros(padded.Size(), MatType.CV_32F)).GetMat(0);
Cv2.Dft(planes, planes);
Cv2.ShiftDft(planes);
Mat magnitude = new Mat();
Cv2.Split(planes, out Mat[] complex);
Cv2.Magnitude(complex[0], complex[1], magnitude);
magnitude = magnitude.Norm(NormTypes.MinMax);
double focusMeasure = Cv2.Sum(magnitude).Val0;
```
3. SIFT特征点匹配评价图像对比度
```csharp
using OpenCvSharp;
using OpenCvSharp.XFeatures2D;
Mat src1 = Cv2.ImRead("image1.jpg", ImreadModes.Grayscale);
Mat src2 = Cv2.ImRead("image2.jpg", ImreadModes.Grayscale);
SIFT sift = SIFT.Create();
KeyPoint[] keypoints1, keypoints2;
Mat descriptors1 = new Mat(), descriptors2 = new Mat();
sift.DetectAndCompute(src1, null, out keypoints1, descriptors1);
sift.DetectAndCompute(src2, null, out keypoints2, descriptors2);
BFMatcher matcher = new BFMatcher(NormTypes.L2, false);
DMatch[] matches = matcher.Match(descriptors1, descriptors2);
double maxDist = matches.Max(m => m.Distance);
double minDist = matches.Min(m => m.Distance);
double contrastMeasure = (maxDist - minDist) / maxDist;
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)