我正在使用C#编写一个程序来检测纸张边缘,并从图像中裁剪出纸张的方形边缘。
以下是我想裁剪的图片。论文将始终显示在页面底部。
我读过这些链接,但我仍然不知道该怎么做。
OpenCV C++/Obj-C: Detecting a sheet of paper / Square Detection
编辑:我正在使用EMGU进行此OCR项目
答案 0 :(得分:3)
你也可以:
ThresholdBinary
查找轮廓。
要查看有关查找轮廓的示例,您可以查看this帖子
FundContours
方法不关心轮廓大小。在找到轮廓之前要做的唯一事情是通过二值化图像来强调它们(我们在步骤2中执行此操作)。
有关详细信息,请查看 OpenCV文档:findContours,example。
根据边界框的大小和位置找到合适的轮廓 (在这一步中,我们迭代在轮廓上找到的所有部分,并尝试使用已知的纸张尺寸,它们的比例和相对位置来弄清楚纸张轮廓中的哪一个 em> - 图像左下角。)
使用纸张的边界框裁剪图像。
Image<Gray, byte> grayImage = new Image<Gray, byte>(colorImage);
Image<Bgr, byte> color = new Image<Bgr, byte>(colorImage);
grayImage = grayImage.ThresholdBinary(new Gray(thresholdValue), new Gray(255));
using (MemStorage store = new MemStorage())
for (Contour<Point> contours= grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE, store); contours != null; contours = contours.HNext)
{
Rectangle r = CvInvoke.cvBoundingRect(contours, 1);
// filter contours by position and size of the box
}
// crop the image using found bounding box
UPD:我添加了更多详细信息。
答案 1 :(得分:0)
结果y应该比你想保留的多1。如果图像太亮,您可能需要插入限制以避免裁剪所有内容。要么改进算法,要么将这样的图像标记为手动处理的例外!
要裁剪,请使用带有源和目标矩形的DrawImage
重载!
以下是一些提示:
要找到纸张颜色,您可以从对角线的左下边缘直接向上,直到您点击Color.GetBrightness
为&gt;的像素为止。 0.8;然后再走2像素,以清除任何抗锯齿像素。
合理的增量取决于您的图像;从10%开始
沿着底部随意散步;当你完成后,可以在第一遍中找到的最小值附近增加一个额外的通行证。
垂直测试可以使用GetPixel
来获取颜色,如果速度太慢,您可能需要查看LockBits
。但是先获取搜索算法,然后再考虑优化!
如果您的代码遇到问题,请扩展您的问题!