- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用pangu的三个图像来使用emgucv和C#测试图像的倾斜度。
位于顶部的第一张图像检测到180度正常工作。
中间检测到的90度第二张图像应检测为180度。
检测到的第三个图像180度应检测为90度。
我想在这里分享的一个观察结果是,当我使用画笔从潘卡的上下两边裁剪掉不需要的图像部分时,使用下面提到的代码可以给我预期的结果。
现在,我想了解如何使用编程来删除不需要的部分。
我玩过轮廓和roi,但我不知道该如何拟合。我无法理解emgucv本身是选择轮廓还是必须做一些事情。
请提出任何合适的代码示例。
请检查以下代码以进行 Angular 检测,并请帮助我。提前致谢。
imgInput = new Image<Bgr, byte>(impath);
Image<Gray, Byte> img2 = imgInput.Convert<Gray, Byte>();
Bitmap imgs;
Image<Gray, byte> imgout = imgInput.Convert<Gray, byte>().Not().ThresholdBinary(new Gray(50), new Gray(125));
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
Emgu.CV.Mat hier = new Emgu.CV.Mat();
var blurredImage = imgInput.SmoothGaussian(5, 5, 0 , 0);
CvInvoke.AdaptiveThreshold(imgout, imgout, 255, Emgu.CV.CvEnum.AdaptiveThresholdType.GaussianC, Emgu.CV.CvEnum.ThresholdType.Binary, 5, 45);
CvInvoke.FindContours(imgout, contours, hier, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
if (contours.Size >= 1)
{
for (int i = 0; i <= contours.Size; i++)
{
Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);
RotatedRect box = CvInvoke.MinAreaRect(contours[i]);
PointF[] Vertices = box.GetVertices();
PointF point = box.Center;
PointF edge1 = new PointF(Vertices[1].X - Vertices[0].X, Vertices[1].Y - Vertices[0].Y);
PointF edge2 = new PointF(Vertices[2].X - Vertices[1].X, Vertices[2].Y - Vertices[1].Y);
double r = edge1.X + edge1.Y;
double edge1Magnitude = Math.Sqrt(Math.Pow(edge1.X, 2) + Math.Pow(edge1.Y, 2));
double edge2Magnitude = Math.Sqrt(Math.Pow(edge2.X, 2) + Math.Pow(edge2.Y, 2));
PointF primaryEdge = edge1Magnitude > edge2Magnitude ? edge1 : edge2;
double primaryMagnitude = edge1Magnitude > edge2Magnitude ? edge1Magnitude : edge2Magnitude;
PointF reference = new PointF(1, 0);
double refMagnitude = 1;
double thetaRads = Math.Acos(((primaryEdge.X * reference.X) + (primaryEdge.Y * reference.Y)) / (primaryMagnitude * refMagnitude));
double thetaDeg = thetaRads * 180 / Math.PI;
imgInput = imgInput.Rotate(thetaDeg, new Bgr());
imgout = imgout.Rotate(box.Angle, new Gray());
Bitmap bmp = imgout.Bitmap;
break;
}
}
最佳答案
问题
让我们从解决方案之前的问题开始:
您的密码
当您提交代码时,寻求帮助,至少需要付出一些努力来“清理”它。帮助人们帮助您!这里有太多的代码行什么都不做。您声明从未使用过的变量。添加一些注释,使人们知道您认为代码应该执行的操作。
Bitmap imgs;
var blurredImage = imgInput.SmoothGaussian(5, 5, 0, 0);
Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);
PointF point = box.Center;
double r = edge1.X + edge1.Y;
// Etc
自适应阈值
CvInvoke.AdaptiveThreshold(imgout, imgout, 255, Emgu.CV.CvEnum.AdaptiveThresholdType.GaussianC, Emgu.CV.CvEnum.ThresholdType.Binary, 5, 45);
图片1
CvInvoke.NamedWindow("Output");
CvInvoke.Imshow("Output", imgout);
CvInvoke.WaitKey();
tu
WarpAffine
应用的转换矩阵。// Working Images
Image<Bgr, byte> imgInput = new Image<Bgr, byte>("Test1.jpg");
Image<Gray, byte> imgEdges = new Image<Gray, byte>(imgInput.Size);
Image<Gray, byte> imgDilatedEdges = new Image<Gray, byte>(imgInput.Size);
Image<Bgr, byte> imgOutput;
// 1. Edge Detection
CvInvoke.Canny(imgInput, imgEdges, 25, 80);
// 2. Dilation
CvInvoke.Dilate(
imgEdges,
imgDilatedEdges,
CvInvoke.GetStructuringElement(
ElementShape.Rectangle,
new Size(3, 3),
new Point(-1, -1)),
new Point(-1, -1),
5,
BorderType.Default,
new MCvScalar(0));
// 3. Contours Detection
VectorOfVectorOfPoint inputContours = new VectorOfVectorOfPoint();
Mat hierarchy = new Mat();
CvInvoke.FindContours(
imgDilatedEdges,
inputContours,
hierarchy,
RetrType.External,
ChainApproxMethod.ChainApproxSimple);
VectorOfPoint primaryContour = (from contour in inputContours.ToList()
orderby contour.GetArea() descending
select contour).FirstOrDefault();
// 4. Corner Point Extraction
RotatedRect bounding = CvInvoke.MinAreaRect(primaryContour);
PointF topLeft = (from point in bounding.GetVertices()
orderby Math.Sqrt(Math.Pow(point.X, 2) + Math.Pow(point.Y, 2))
select point).FirstOrDefault();
PointF topRight = (from point in bounding.GetVertices()
orderby Math.Sqrt(Math.Pow(imgInput.Width - point.X, 2) + Math.Pow(point.Y, 2))
select point).FirstOrDefault();
PointF botLeft = (from point in bounding.GetVertices()
orderby Math.Sqrt(Math.Pow(point.X, 2) + Math.Pow(imgInput.Height - point.Y, 2))
select point).FirstOrDefault();
PointF botRight = (from point in bounding.GetVertices()
orderby Math.Sqrt(Math.Pow(imgInput.Width - point.X, 2) + Math.Pow(imgInput.Height - point.Y, 2))
select point).FirstOrDefault();
double boundingWidth = Math.Sqrt(Math.Pow(topRight.X - topLeft.X, 2) + Math.Pow(topRight.Y - topLeft.Y, 2));
double boundingHeight = Math.Sqrt(Math.Pow(botLeft.X - topLeft.X, 2) + Math.Pow(botLeft.Y - topLeft.Y, 2));
bool isLandscape = boundingWidth > boundingHeight;
// 5. Define warp crieria as triangles
PointF[] srcTriangle = new PointF[3];
PointF[] dstTriangle = new PointF[3];
Rectangle ROI;
if (isLandscape)
{
srcTriangle[0] = botLeft;
srcTriangle[1] = topLeft;
srcTriangle[2] = topRight;
dstTriangle[0] = new PointF(0, (float)boundingHeight);
dstTriangle[1] = new PointF(0, 0);
dstTriangle[2] = new PointF((float)boundingWidth, 0);
ROI = new Rectangle(0, 0, (int)boundingWidth, (int)boundingHeight);
}
else
{
srcTriangle[0] = topLeft;
srcTriangle[1] = topRight;
srcTriangle[2] = botRight;
dstTriangle[0] = new PointF(0, (float)boundingWidth);
dstTriangle[1] = new PointF(0, 0);
dstTriangle[2] = new PointF((float)boundingHeight, 0);
ROI = new Rectangle(0, 0, (int)boundingHeight, (int)boundingWidth);
}
Mat warpMat = new Mat(2, 3, DepthType.Cv32F, 1);
warpMat = CvInvoke.GetAffineTransform(srcTriangle, dstTriangle);
// 6. Apply the warp and crop
CvInvoke.WarpAffine(imgInput, imgInput, warpMat, imgInput.Size);
imgOutput = imgInput.Copy(ROI);
imgOutput.Save("Output1.bmp");
使用了两种扩展方法:
static List<VectorOfPoint> ToList(this VectorOfVectorOfPoint vectorOfVectorOfPoint)
{
List<VectorOfPoint> result = new List<VectorOfPoint>();
for (int contour = 0; contour < vectorOfVectorOfPoint.Size; contour++)
{
result.Add(vectorOfVectorOfPoint[contour]);
}
return result;
}
static double GetArea(this VectorOfPoint contour)
{
RotatedRect bounding = CvInvoke.MinAreaRect(contour);
return bounding.Size.Width * bounding.Size.Height;
}
产出
关于c# - emgucv:C#中的Pan Card不当偏斜检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62550517/
我有一个动态生成的 svg 图像,我正在使用 Ariutta 的 svg-pan-zoom 插件。当我双击 svg 图像时,我设置 pan.x = centerOfScreenX 和 pan.y =
我发现了一个名为 raphael-pan-zoom 的插件,我用它来放大和缩小我论文中的 raphaeljs 元素,缩放效果很好,但是当我想将论文向左、向右移动时,上或下我没有成功。我在“raphae
我有 x 轴的缩放和平移功能,但我想为 y 轴添加平移功能。我尝试使用 d3.behavior.zoom 和 d3.event.translate[1] 来获取 y 平移值并使用它,但是当缩放发生时平
我正在使用平移手势识别器,我需要检测初始触摸点才能采取行动。我正在使用以下代码; @IBAction func panDetected(sender: UIPanGestureRecognizer)
我试图禁止用户使用鼠标平移,但仍然允许使用按键平移。如果使用controls.enablePan = false;,我无法使用按键进行平移。但是,如果我尝试重新绑定(bind)鼠标按钮,它会强制我将鼠
我正在使用平移手势识别器进行一些测试。设置非常简单,我有一个 20x20 的框 View ,并通过相对布局进行设置。平移手势的处理程序 switch (args.StatusType)
我有包含任何文本的字符串。它可以是这样的 - “abcdef 123456789521 zxcvb”,和 - “45651256”,和 - “asdad 564654 sddsf 4”。我想在文本 P
我正在使用平移手势识别器进行一些测试。设置非常简单,我有一个 20x20 的框 View ,并通过相对布局进行设置。平移手势的处理程序 switch (args.StatusType)
给定一段 P 单词,其中包含一些 PAN 卡号。计算 P 中不同的有效 PAN 卡号的数量。 有效的 PAN 卡号是 10 个长度的字母数字单词,格式为:“AAAAA1111A” A 表示任意英文大写
我正在尝试使用 iOS7 的自定义转换,以便让用户通过一种“平移”效果在 View Controller 之间导航。 如图所示: 我需要背景图案在 vc 的边界之外继续,这样当用户从 vc1 移动到
我试图阻止我的 UILabel 向下移动到 CONTROLTOPOFFSET 以下。 CONTROLTOPOFFSET = (UIScreen.mainScreen().bounds.size.hei
我目前正在编写一个简单的 3d 声音系统,但我遇到了困难。 问题是:我在空间中有一个点,声音来自那里,当然我还有听者,他的点和方向。 距离不是问题,它工作得很好,但是当我想计算声音的声像(左/右多少)
我正在使用 Hammerjs 的 jQuerys 插件。 $('.grab').hammer().on('pan', function(ev){console.info(ev)); //(44) pa
我正在使用ariutta svg-pan-zoom库(https://github.com/ariutta/svg-pan-zoom)。 当用户单击按钮时,我试图在(x:1000,y:20)平移到特定
我正在主视图上安装 UIPanGestureRecognizer,如下所示: panGesture = UIPanGestureRecognizer(target: self, action: #
我正在尝试从我的 iOS 应用程序中创建一个蓝牙个人区域网络 (PAN)。基于MFi FAQ和 HT3647 ,应该可以使用蓝牙 PAN 与其他(非 iOS 设备)通话。但是,我找不到有关如何在 iO
我正在从 PAN 卡中检索 PAN 号码。当我抓取 pan 编号时,有时它在几个数字之间有一些空格,例如 DWKP K3344E,其中实际的 PAN 编号表达式为 ABCDE1234F。我想在正则表达
在 Leaflet JS 库中,它说: Pans the map to a given center. Makes an animated pan if new center is not more
我想知道是否有一种方法可以将我的 scrollView 推得比 "android:windowSoftInputMode="adjustPan" 更高。它看起来有点局促,就像现在这样。enter im
我对这里阻止重置的原因感到困惑。在 resetZoom() 函数运行后,在我平移 svg 之前什么都没有发生,然后它迅速回到原点。知道为什么会发生这种情况吗? 在这里 fiddle :https://
我是一名优秀的程序员,十分优秀!