int m, n; for (m = 0; m < contours.size(); m++) { for (n = 0; n < contours[m].size(); n++) { switch (m) { case 0: point_0.push_back(contours[m][n]); break; case 1: point_1.push_back(contours[m][n]); break; case 2: point_2.push_back(contours[m][n]); break; case 3: point_3.push_back(contours[m][n]); break; case 4: point_4.push_back(contours[m][n]); break; case 5: point_5.push_back(contours[m][n]); break; case 6: point_6.push_back(contours[m][n]); break; case 7: point_7.push_back(contours[m][n]); break; case 8: point_8.push_back(contours[m][n]); break; case 9: point_9.push_back(contours[m][n]); break; case 10: point_10.push_back(contours[m][n]); break; case 11: point_11.push_back(contours[m][n]); break; case 12: point_12.push_back(contours[m][n]); break; case 13: point_13.push_back(contours[m][n]); break; case 14: point_14.push_back(contours[m][n]); break; case 15: point_15.push_back(contours[m][n]); break; case 16: point_16.push_back(contours[m][n]); break; case 17: point_17.push_back(contours[m][n]); break; case 18: point_18.push_back(contours[m][n]); break; case 19: point_19.push_back(contours[m][n]); break; default: cout << "input error" << endl; } } } Mat img(321, 432, CV_8UC1, cv::Scalar(0));
时间: 2023-06-27 18:05:55 浏览: 155
这段代码是对轮廓进行分类并将每一类轮廓的点存储在不同的容器中,然后创建一个大小为321x432的黑色图像。其中,contours是一个向量容器,存储了检测到的轮廓,m和n是循环变量,point_0至point_19是存储不同类别轮廓点的向量容器。在循环中,通过switch语句根据m的值将每个点存储在对应的容器中。最后,使用cv::Scalar(0)创建一个颜色为黑色的Mat对象,作为输出的图像。
相关问题
import cv2 import numpy as np from PIL import Image import turtle # 读取照片 img = cv2.imread("2.jpg") # 将照片转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 进行边缘检测 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # 进行轮廓提取 contours, hierarchy = cv2.findContours( edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 将轮廓转换为线稿数据 outline = "" for contour in contours: outline += "M\n" for pt in contour: outline += f"{pt[0][0]} {pt[0][1]}\n" outline += "Z\n" # 设置画笔 turtle.pen(pensize=2, pencolor="black") # 将线稿数据转换为坐标列表 coords = [] for c in outline: if c == "M": x, y = map(int, f.readline().split()) turtle.penup() turtle.goto(x, y) turtle.pendown() elif c == "L": x, y = map(int, f.readline().split()) turtle.goto(x, y) # 隐藏画笔 turtle.hideturtle()报错NameError: name 'f' is not defined
根据你提供的代码,报错是因为 `f` 这个变量没有定义。在你的代码中,似乎没有定义 `f` 这个变量,因此会出现 "NameError: name 'f' is not defined" 的错误。
推测可能是你在将轮廓数据转换为坐标列表时,使用了一个没有定义的 `f` 变量。建议你检查一下代码,确认该变量是否已经定义,并且是否被正确引用。如果有任何其他问题,请随时提出。
使用Cplusplus,有4条曲线:已知每条曲线的中心线的点坐标集合(每两个点是顺序紧邻的)。 要求对曲线往两侧扩固定宽度,沿着曲线的中心线,对其拉直展开成一幅图,函数原型int teUnfoldCurve(const Mat& srcImage, const vector<TePoint>& vCurve, out Mat& dstImage, int iLineHeight)
这个问题可以分为几个步骤来解决:
1. 根据输入的点坐标集合,生成曲线的控制点集合。可以使用Bezier曲线或B样条曲线等进行插值。
2. 根据控制点集合生成曲线的离散点集合,可以通过采样等方式进行。
3. 对离散点集合进行扩展,即将每个点沿着法向方向移动一定距离。
4. 对扩展后的点集合按照顺序连接成多边形,并填充颜色。
5. 将多边形展开成一幅图像。
下面是一个可能的实现:
```C++
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
// 根据控制点集合生成曲线的离散点集合
vector<Point> getCurvePoints(const vector<Point>& controlPoints)
{
vector<Point> curvePoints;
for (double t = 0; t <= 1; t += 0.01) {
Point pt(0, 0);
for (int i = 0; i < controlPoints.size(); i++) {
double coef = binomialCoefficient(controlPoints.size() - 1, i) * pow(t, i) * pow(1 - t, controlPoints.size() - 1 - i);
pt.x += coef * controlPoints[i].x;
pt.y += coef * controlPoints[i].y;
}
curvePoints.push_back(pt);
}
return curvePoints;
}
// 计算组合数C(n,m)
int binomialCoefficient(int n, int m)
{
if (m < 0 || m > n) return 0;
if (m == 0 || m == n) return 1;
int res = 1;
for (int i = 1; i <= m; i++) {
res *= n - i + 1;
res /= i;
}
return res;
}
// 对离散点集合进行扩展
vector<Point> expandCurve(const vector<Point>& curvePoints, double width)
{
vector<Point> expandedPoints;
for (int i = 0; i < curvePoints.size(); i++) {
Point pt1 = curvePoints[i];
Point pt2 = curvePoints[(i + 1) % curvePoints.size()];
Point dir = pt2 - pt1;
Point norm(-dir.y, dir.x);
norm *= width / norm.ddot(norm);
expandedPoints.push_back(pt1 + norm);
}
for (int i = curvePoints.size() - 1; i >= 0; i--) {
Point pt1 = curvePoints[i];
Point pt2 = curvePoints[(i + curvePoints.size() - 1) % curvePoints.size()];
Point dir = pt2 - pt1;
Point norm(-dir.y, dir.x);
norm *= width / norm.ddot(norm);
expandedPoints.push_back(pt1 + norm);
}
return expandedPoints;
}
// 将点集合按照顺序连接成多边形,并填充颜色
void drawPolygon(Mat& img, const vector<Point>& points, const Scalar& color)
{
vector<vector<Point>> contours;
contours.push_back(points);
drawContours(img, contours, -1, color, FILLED);
}
// 将多边形展开成一幅图像
void unfoldPolygon(const Mat& srcImage, const vector<Point>& points, Mat& dstImage, int lineHeight)
{
Rect rect = boundingRect(points);
dstImage.create(Size(rect.width, points.size() * lineHeight), CV_8UC3);
dstImage.setTo(Scalar(255, 255, 255));
for (int i = 0; i < points.size(); i++) {
Point pt = points[i] - Point(rect.x, 0);
Mat roi = dstImage(Rect(pt.x, i * lineHeight, lineHeight, lineHeight));
srcImage(Rect(pt.x, pt.y, lineHeight, lineHeight)).copyTo(roi);
}
}
// 对曲线进行展开
int teUnfoldCurve(const Mat& srcImage, const vector<Point>& vCurve, Mat& dstImage, int iLineHeight)
{
vector<Point> curvePoints = getCurvePoints(vCurve);
vector<Point> expandedPoints = expandCurve(curvePoints, iLineHeight / 2.0);
drawPolygon(dstImage, expandedPoints, Scalar(0, 0, 0));
unfoldPolygon(srcImage, expandedPoints, dstImage, iLineHeight);
return 0;
}
```
需要注意的是,展开后的图像可能会存在较大的畸变,这时可以使用图像校正等技术进行修正。
阅读全文