Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opencv-检测带有内部元素的纸张照片上的矩形_Opencv_Opencv3.0_Opencv Contour - Fatal编程技术网

opencv-检测带有内部元素的纸张照片上的矩形

opencv-检测带有内部元素的纸张照片上的矩形,opencv,opencv3.0,opencv-contour,Opencv,Opencv3.0,Opencv Contour,所以我试着阅读下面的图片 我已经能够设置自适应阈值并检测旋转角度(我不确定是否必须旋转图像) 我正在努力检测包含表单的矩形。我尝试了不同的方法,比如opencv的findContours()。它能找到的最大轮廓是一个有名字的盒子 之后,我决定使用HoughLinesP,但它发现了很多行,我不知道如何过滤它们。它还可以很方便地检测矩形以对表单进行反扭曲,之后我将能够轻松地阅读答案。 因此,我已经在考虑在拐角处添加黑色方形标记。。但也许有人能给我一些正确的方法 HoughLinesP(我使用nod

所以我试着阅读下面的图片

我已经能够设置自适应阈值并检测旋转角度(我不确定是否必须旋转图像)

我正在努力检测包含表单的矩形。我尝试了不同的方法,比如opencv的findContours()。它能找到的最大轮廓是一个有名字的盒子

之后,我决定使用HoughLinesP,但它发现了很多行,我不知道如何过滤它们。它还可以很方便地检测矩形以对表单进行反扭曲,之后我将能够轻松地阅读答案。 因此,我已经在考虑在拐角处添加黑色方形标记。。但也许有人能给我一些正确的方法

HoughLinesP(我使用nodejs,但我可以阅读python和c++):

const imageSize={
宽度:灰色.cols,
高度:灰色。行
};
常数阈值_min=200;
常数比_最小值_最大值=1;
const edges=gray.canny(阈值最小值,阈值最小值*比率最小值最大值,3);
const minLineLength=imageSize.width/4,
maxLineGap=10,
阈值=100;
const lines=edges.houghLinesP(1,Math.PI/180,阈值,minLineLength,maxLineGap);
//在输出上画线
对于(设i=0;i//结束绘制线
好的,因此我能够通过使用膨胀来检测矩形:

  let {area, contour} = getMaxContour(gray);

  let dilateIterations = 0;

  const MAX_DILATE_ITERATIONS = 9;
  while(area<MINIMAL_POSSIBLE_AREA && dilateIterations<MAX_DILATE_ITERATIONS){
    dilateIterations++;
    gray = gray.dilate(new cv.Mat(), new cv.Point(-1,-1), 1, cv.BORDER_CONSTANT);

    let result = getMaxContour(gray);
    contour = result.contour;
    area = result.area;

    if(DEBUG) {
      writeImage(`dilated_${dilateIterations}.png`, gray);
    }
  }
let{area,contour}=getMaxContour(灰色);
设迭代次数=0;
常数最大扩张迭代次数=9;
while(区域){
//常数周长=等高线弧长(等高线,真值);
常数周长=等高线弧长(真);
常数近似值=轮廓近似值(0.1*周长,真值);
常数面积=等高线矩()['m00'];
如果(大约长度==4&&maxAreaFound


在那之后,我可以突出显示角点并进行进一步的透视修正。

因此,在经过6次迭代找到轮廓之前,我可以使用扩张函数找到轮廓。我一直在寻找一个面积最大的矩形物体。但我现在很好奇,如果照片拍摄得再远一点,如何检测它,这样纸张就完全适合了如何检测内部轮廓?先拍一张更好的照片。我会将其扫描成pdf格式,而不仅仅是使用手机上的图像。不要让工作变得比需要的更难。如果可以,我会这样做,但这是任务条件。这太容易了——只需获得一张没有扭曲和旋转的完美图像,但这就是程序在设定的条件下进行撞击挑战。
const getMaxContour = (image) => {
  const contours = image.findContours(cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE);
  let maxAreaFound = 0;
  let maxContour = [];
  let contourObj = null;
  console.log(`Found ${contours.length} contours.`);
  contours.forEach((contour,i)=>{
    // const perimeter = cv.arcLength(contour, true);
    const perimeter = contour.arcLength(true);
    const approx = contour.approxPolyDP(0.1*perimeter, true);
    const area = contour.moments()['m00'];

    if (approx.length == 4 && maxAreaFound<area){
      maxAreaFound = area;        
      maxContour = approx;
      contourObj=contour;
    }  
  });

  console.log(JSON.stringify(contourObj))
  console.log(`Max contour area found ${maxAreaFound}.`);

  return {
    contour:maxContour,
    area:maxAreaFound
  };
}