zoukankan      html  css  js  c++  java
  • 寻找精密光学标定板上的矩形(网友提问)

    这道题目来源于网友问答,采用博客方式回答比较容易说明。

    问题:
    对于这样的图片
    如何寻找上面的矩形
     
    思路:
    这个矩形的面积在所有的图像中是最大的(除去整个图形轮廓以外),可以尝试从这个方面入手,再加上一些鲁壮的方法
     
     
    #include "stdafx.h"
    #include <opencv2/opencv.hpp>
    #include "GOCVHelper.h"
    #include <iostream>
    using namespace cv;
    using namespace std;
     
    int main( int argc, const char** argv )
    {
        Mat src = imread("card.png",IMREAD_COLOR);
        Mat gray;
        int imax = 0//代表最大轮廓的序号
        int imaxcontour = -1//代表最大轮廓的大小
        std::vector<std::vector<Point>>contours;    
        cvtColor(src,gray,COLOR_BGR2GRAY);
        threshold(gray,gray,100,255,THRESH_OTSU);
        bitwise_not(gray,gray);// 白色代表有数据
        //寻找轮廓
        findContours(gray,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
        //冒泡排序,由大到小排序
        VP vptmp;
        for(int i=1;i<contours.size();i++){
            for(int j=contours.size()-1;j>=i;j--){
                if( contourArea(contours[j])> contourArea(contours[j-1])){    
                    //swap
                    vptmp = contours[j-1];
                    contours[j-1= contours[j];
                    contours[j] = vptmp;
                }
            }
        }
        //找到最后结果的时候,添加一些判断
        for (int i = 0;i<contours.size();i++)
        {
            if (contourArea(contours[i]) < (src.rows * src.cols)/8 )
            {
                drawContours(src,contours,i,Scalar(0,0,255),-1);
                break;
            }
        }
        imshow("结果",src);
        waitKey();
        return 0;
    }
     
    结果:
     
    小结:
    当然这里只是对最简单的模板图片进行了处理。如果在实际的摄像机拍摄的过程中,肯定会有其他的干扰,需要区别对待。
  • 相关阅读:
    List集合中的对象按照某个字段去重实现
    菜单--微信提醒
    fastTime从后台传过来显示格式的处理
    彻底卸载Oracle
    关于这次安装Oracle
    关于下拉选择删选最基本一例(分享内容)
    马拉松参赛人员显示(瞬逝版)
    马拉松参赛人员旧版本最终版(私藏版)
    win 10 初始环境变量
    AngularJS输出helloworld
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/7088478.html
Copyright © 2011-2022 走看看