在OpenCVSharp里srcImage.At<Vec3b>(i, j) = new Vec3b(0, 0, 255);报错赋值左面必须是变量,属性,索引器怎么修改
时间: 2024-03-04 15:49:24 浏览: 129
在 OpenCVSharp 中,`At` 方法返回的是引用,您可以直接将 `Vec3b` 类型的对象赋值给它。具体代码如下所示:
```
srcImage.At<Vec3b>(i, j) = new Vec3b(0, 0, 255);
```
修改为:
```
srcImage.At<Vec3b>(i, j) = new Vec3b { Item0 = 0, Item1 = 0, Item2 = 255 };
```
这将会将 `srcImage` 中第 `i` 行第 `j` 列的像素值赋值为蓝色。注意,这里使用了对象初始化器来创建 `Vec3b` 类型的对象,这是 C# 中的语法。
相关问题
opencvsharp图片颜色反转
使用OpenCvSharp进行图片颜色反转可以通过以下步骤实现:
1. 导入OpenCvSharp库,确保已安装相关环境和引入命名空间。
```csharp
using OpenCvSharp;
```
2. 读取图片文件并创建Mat对象。
```csharp
Mat srcImage = Cv2.ImRead("image.jpg", ImreadModes.Color);
```
3. 获取图像的宽度和高度。
```csharp
int width = srcImage.Cols;
int height = srcImage.Rows;
```
4. 创建一个新的Mat对象,用于存储反转后的图像。
```csharp
Mat invertedImage = new Mat(height, width, srcImage.Type());
```
5. 遍历原始图像的每个像素,并将其颜色反转后复制到新的图像中。
```csharp
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
Vec3b pixel = srcImage.At<Vec3b>(row, col);
Vec3b invertedPixel = new Vec3b((byte)(255 - pixel.Item0), (byte)(255 - pixel.Item1), (byte)(255 - pixel.Item2));
invertedImage.Set<Vec3b>(row, col, invertedPixel);
}
}
```
6. 保存输出结果。
```csharp
invertedImage.SaveImage("inverted_image.jpg");
```
以上是使用OpenCvSharp进行图片颜色反转的简单示例。通过遍历图像的每个像素并将其颜色值与255之差赋给新图像的相应像素,实现了颜色的反转。
opencvsharp 编写找边函数FindSubPixelEdge
OpenCvSharp 是 C# 语言的 OpenCV 库。如果你想要编写一个找边函数 FindSubPixelEdge,可以参考以下步骤:
1. 读取需要进行边缘检测的图像,并将其转换为灰度图像。
```csharp
Mat srcImage = new Mat("image.jpg", ImreadModes.Grayscale);
```
2. 使用 Canny 算法进行边缘检测。
```csharp
Mat edges = new Mat();
Cv2.Canny(srcImage, edges, 50, 150);
```
3. 使用 HoughLinesP 函数进行直线检测。
```csharp
LineSegmentPoint[] lines = Cv2.HoughLinesP(edges, 1, Math.PI / 180, 50, 50, 10);
```
4. 对于每条直线,使用 FindContours 函数找到其边缘。
```csharp
for (int i = 0; i < lines.Length; i++)
{
Point pt1 = lines[i].P1;
Point pt2 = lines[i].P2;
Mat lineImage = new Mat(srcImage.Size(), MatType.CV_8UC1, Scalar.All(0));
Cv2.Line(lineImage, pt1, pt2, Scalar.All(255), 1, LineTypes.AntiAlias);
Point[] contour;
HierarchyIndex[] hierarchy;
Cv2.FindContours(lineImage, out contour, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 在这里对每个轮廓进行 subpixel 精度的边缘检测
}
```
5. 对于每个轮廓,可以使用 FitLine 函数拟合出其直线方程,并求出边缘。
```csharp
Vec4f line;
Cv2.FitLine(contour, out line, DistanceTypes.L2, 0, 0.01, 0.01);
for (int j = 0; j < contour.Length; j++)
{
Point pt = contour[j];
float x = pt.X;
float y = pt.Y;
float k = line[1] / line[0];
float b = line[3] - k * line[2];
float dist = Math.Abs(k * x - y + b) / Math.Sqrt(k * k + 1);
// 在这里可以对 dist 进行阈值判断,以确定边缘位置
}
```
以上就是一个简单的基于 OpenCvSharp 的 FindSubPixelEdge 函数的实现。
阅读全文