在OpenCVSharp里srcImage.At<Vec3b>(i, j) = new Vec3b(0, 0, 255);报错赋值左面必须是变量,属性,索引器怎么修改
时间: 2024-03-04 20:49:24 浏览: 152
在 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之差赋给新图像的相应像素,实现了颜色的反转。
有4条曲线:已知每条曲线的中心线的点坐标集合(每两个点是顺序紧邻的)。 要求对曲线往两侧扩固定宽度,沿着曲线的中心线,对其拉直展开成一幅图,函数原型int teUnfoldCurve(const Mat& srcImage, const vector<TePoint>& vCurve, out Mat& dstImage, int iLineHeight)
函数原型如下:
```c++
int teUnfoldCurve(const cv::Mat& srcImage, const std::vector<TePoint>& vCurve, cv::Mat& dstImage, int iLineHeight);
```
其中,参数说明如下:
- `srcImage`:输入图像,可以是任意通道数的彩色图像或单通道灰度图像。
- `vCurve`:曲线的中心线点坐标集合,类型为 `std::vector<TePoint>`,其中 `TePoint` 是一个结构体,包含 `x` 和 `y` 两个成员变量表示点的坐标。
- `dstImage`:输出图像,与输入图像大小相同,类型与输入图像相同。
- `iLineHeight`:曲线的展开后的宽度,即沿着曲线展开后的每一条线段的宽度。
函数的实现步骤如下:
1. 根据输入的曲线点集合,计算曲线的切线方向,即每个点的切线角度。
2. 沿着曲线的中心线,在曲线的两侧分别扩展出指定宽度的区域,形成一个带状区域。
3. 将带状区域沿着曲线的切线方向进行拉伸,使其展开成一条直线。
4. 将拉直后的直线投影到输出图像上,得到展开后的图像。
具体实现可以参考以下代码:
```c++
struct TePoint {
int x, y;
};
int teUnfoldCurve(const cv::Mat& srcImage, const std::vector<TePoint>& vCurve, cv::Mat& dstImage, int iLineHeight) {
// 计算曲线的切线方向
std::vector<double> vAngle;
for (int i = 0; i < vCurve.size() - 1; i++) {
double dx = vCurve[i + 1].x - vCurve[i].x;
double dy = vCurve[i + 1].y - vCurve[i].y;
double angle = atan2(dy, dx);
vAngle.push_back(angle);
}
// 扩展出带状区域
cv::Mat srcGray;
cv::cvtColor(srcImage, srcGray, cv::COLOR_BGR2GRAY);
cv::Mat dstGray(srcGray.size(), CV_8U, cv::Scalar(0));
for (int i = 0; i < vCurve.size() - 1; i++) {
double angle = vAngle[i];
cv::Point2f ptLeft(vCurve[i].x - iLineHeight * sin(angle), vCurve[i].y + iLineHeight * cos(angle));
cv::Point2f ptRight(vCurve[i].x + iLineHeight * sin(angle), vCurve[i].y - iLineHeight * cos(angle));
cv::Point2f ptLeftNext(vCurve[i + 1].x - iLineHeight * sin(angle), vCurve[i + 1].y + iLineHeight * cos(angle));
cv::Point2f ptRightNext(vCurve[i + 1].x + iLineHeight * sin(angle), vCurve[i + 1].y - iLineHeight * cos(angle));
std::vector<cv::Point2f> pts;
pts.push_back(ptLeft);
pts.push_back(ptRight);
pts.push_back(ptRightNext);
pts.push_back(ptLeftNext);
cv::fillConvexPoly(dstGray, pts, cv::Scalar(255));
}
// 拉直带状区域
cv::Mat dstLine(dstGray.size(), CV_8U, cv::Scalar(0));
for (int i = 0; i < vCurve.size() - 1; i++) {
double angle = vAngle[i];
cv::Point2f ptLeft(vCurve[i].x - iLineHeight * sin(angle), vCurve[i].y + iLineHeight * cos(angle));
cv::Point2f ptRight(vCurve[i].x + iLineHeight * sin(angle), vCurve[i].y - iLineHeight * cos(angle));
cv::Point2f ptLeftNext(vCurve[i + 1].x - iLineHeight * sin(angle), vCurve[i + 1].y + iLineHeight * cos(angle));
cv::Point2f ptRightNext(vCurve[i + 1].x + iLineHeight * sin(angle), vCurve[i + 1].y - iLineHeight * cos(angle));
cv::Point2f ptLeftMid((ptLeft.x + ptLeftNext.x) / 2, (ptLeft.y + ptLeftNext.y) / 2);
cv::Point2f ptRightMid((ptRight.x + ptRightNext.x) / 2, (ptRight.y + ptRightNext.y) / 2);
cv::line(dstLine, ptLeftMid, ptRightMid, cv::Scalar(255), iLineHeight);
}
// 投影到输出图像上
cv::Mat dstGray2;
cv::cvtColor(dstLine, dstGray2, cv::COLOR_GRAY2BGR);
cv::Mat dstImage2(dstImage.size(), dstImage.type(), cv::Scalar(0));
for (int i = 0; i < dstImage2.rows; i++) {
for (int j = 0; j < dstImage2.cols; j++) {
if (dstGray2.at<uchar>(i, j) > 0) {
dstImage2.at<cv::Vec3b>(i, j) = srcImage.at<cv::Vec3b>(i, j);
}
}
}
dstImage = dstImage2.clone();
return 0;
}
```
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.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)