C# 我的绘图臂系统有问题
我目前正在建立一个项目,允许用户输入一个图像,然后使用伺服臂绘制它。使用的语言是C#。该程序的工作方式是,用户上传一张图片,然后使用Sobel边缘检测算法对图片进行处理,并将新图片打印到图片框上。我已经设法从图片中获得X和Y的值,并使手臂中的每个伺服装置沿着这些点移动,从而在空白纸上绘制图片,但是Sobel的工作方式是,如果不使用Z轴来知道何时将笔推到纸上绘制和何时不绘制,几乎不可能绘制图像。这是我正在使用的代码。我想知道是否有更平滑的东西,如素描,并在一轮中绘制它,而不必将笔作为Z轴上下移动C# 我的绘图臂系统有问题,c#,image-processing,drawing,edge-detection,sketching,C#,Image Processing,Drawing,Edge Detection,Sketching,我目前正在建立一个项目,允许用户输入一个图像,然后使用伺服臂绘制它。使用的语言是C#。该程序的工作方式是,用户上传一张图片,然后使用Sobel边缘检测算法对图片进行处理,并将新图片打印到图片框上。我已经设法从图片中获得X和Y的值,并使手臂中的每个伺服装置沿着这些点移动,从而在空白纸上绘制图片,但是Sobel的工作方式是,如果不使用Z轴来知道何时将笔推到纸上绘制和何时不绘制,几乎不可能绘制图像。这是我正在使用的代码。我想知道是否有更平滑的东西,如素描,并在一轮中绘制它,而不必将笔作为Z轴上下移动
int oldi = 0;
int oldj=0;
private void sobel()
{
Bitmap originalImage = new Bitmap(ResizeImage(pictureBox1.Image, 70, 70));
Bitmap sobelImage = new Bitmap(originalImage);
int width = originalImage.Width;
int height = originalImage.Height;
int[,] gx = new int[,] { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } };
int[,] gy = new int[,] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } };
int[,] allPixR = new int[width, height];
int[,] allPixG = new int[width, height];
int[,] allPixB = new int[width, height];
int limit = 150 * 150;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
allPixR[i, j] = originalImage.GetPixel(i, j).R;
allPixG[i, j] = originalImage.GetPixel(i, j).G;
allPixB[i, j] = originalImage.GetPixel(i, j).B;
}
}
int new_rx = 0, new_ry = 0;
int new_gx = 0, new_gy = 0;
int new_bx = 0, new_by = 0;
int rc, gc, bc;
for (int i = 1; i < originalImage.Width - 1; i++)
{
for (int j = 1; j < originalImage.Height - 1; j++)
{
new_rx = 0;
new_ry = 0;
new_gx = 0;
new_gy = 0;
new_bx = 0;
new_by = 0;
rc = 0;
gc = 0;
bc = 0;
for (int wi = -1; wi < 2; wi++)
{
for (int hw = -1; hw < 2; hw++)
{
rc = allPixR[i + hw, j + wi];
new_rx += gx[wi + 1, hw + 1] * rc;
new_ry += gy[wi + 1, hw + 1] * rc;
gc = allPixG[i + hw, j + wi];
new_gx += gx[wi + 1, hw + 1] * gc;
new_gy += gy[wi + 1, hw + 1] * gc;
bc = allPixB[i + hw, j + wi];
new_bx += gx[wi + 1, hw + 1] * bc;
new_by += gy[wi + 1, hw + 1] * bc;
}
}
if (new_rx * new_rx + new_ry * new_ry > limit || new_gx * new_gx + new_gy * new_gy > limit || new_bx * new_bx + new_by * new_by > limit)
{
// Draws the edges of the picture on picture box 2
sobelImage.SetPixel(i, j, Color.Black);
if (oldi != i)
{
oldi = i;
// move along the X axis
ezB_Connect1.EZB.Servo.SetServoPosition(EZ_B.Servo.ServoPortEnum.D0, i);
Thread.Sleep(500);
}
if (oldj != j)
{
// move along the Y axis
答:没有。只有非常有限的路径子集可以用这种方式绘制,因此几乎不可能为其制作算法(想象一幅只有两个圆的图片,一个在顶部,一个在底部…)谢谢你的回答,但是我不知道该怎么办,我安装了第三个伺服装置,当算法打印白色时,用它来调高画笔,当它打印黑色时,用它来调低画笔,但效果不是很好。
oldj = j;
}
}
pictureBox2.Image = sobelImage;
}
else
{
// draws white "fills the insides of edges"
sobelImage.SetPixel(i, j, Color.White);
}
}
}