pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

正方形檢測沒有找到正方形

Square detection doesn#39;t find squares(正方形檢測沒有找到正方形)
本文介紹了正方形檢測沒有找到正方形的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正在使用 OpenCV 庫示例中提供的程序 squares.c.它適用于每個圖像,但我真的不明白為什么它不能識別該圖像中繪制的正方形

DILATE 之后:

RESULT 圖像(紅色)http://img267.imageshack.us/img267/8016/resultuq.jpg

如您所見,未檢測到正方形.

檢測后我需要提取正方形中包含的區域......沒有ROI怎么可能?

解決方案

下面的源代碼展示了 Square Detector 程序的一個小變化.它并不完美,但它說明了解決您的問題的一種方法.

您可以此代碼與原始代碼進行比較并檢查所做的所有更改,但主要的更改是:

  • 將閾值級別的數量減少到 2.

  • findSquares()的開頭,擴大圖像檢測細小的白色方塊,然后模糊整個圖像,因此算法不會將大海和天空檢測為單個方塊.

編譯后,使用以下語法運行應用程序:./app

//平方檢測器"程序.//它順序加載多個圖像并嘗試在其中找到正方形//每張圖片#include "highgui.h"#include "cv.h"#include #include <math.h>#include 使用命名空間 cv;使用命名空間標準;無效的幫助(){cout<<"
一個使用金字塔縮放、Canny、輪廓、輪廓簡化和
的程序"內存存儲(所有人都可以找到)
""圖像列表中的方塊 pic1-6.png
""返回在圖像上檢測到的正方形序列.
""序列存儲在指定的內存中
"呼叫:
""./平方
""使用 OpenCV 版本 %s
" <<CV_VERSION <<"
" <<結束;}整數閾值 = 50,N = 2;//karlphillip:將 N 減少到 2,是 11.const char* wndname = "平方檢測演示";//輔助函數://找到向量之間夾角的余弦值//從 pt0->pt1 和從 pt0->pt2雙角(點pt1,點pt2,點pt0){雙 dx1 = pt1.x - pt0.x;雙 dy1 = pt1.y - pt0.y;雙 dx2 = pt2.x - pt0.x;雙 dy2 = pt2.y - pt0.y;返回 (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);}//返回在圖像上檢測到的正方形序列.//序列存儲在指定的內存中void findSquares( const Mat& image, vector<vector<Point> >& squares ){squares.clear();Mat pyr, timg, gray0(image.size(), CV_8U), gray;//karlphillip: 擴大圖像,以便此技術可以檢測白色方塊,墊出(圖像);擴張(出,出,墊(),點(-1,-1));//然后模糊它,使海洋/大海成為一大段,以避免將它們檢測為 2 個大方塊.中值模糊(出,出,7);//縮小和放大圖像以濾除噪聲pyrDown(out, pyr, Size(out.cols/2, out.rows/2));pyrUp(pyr, timg, out.size());矢量<矢量<點>>輪廓;//在圖像的每個顏色平面中找到正方形for( int c = 0; c <3; c++ ){int ch[] = {c, 0};mixChannels(&timg, 1, &gray0, 1, ch, 1);//嘗試幾個閾值級別for( int l = 0; l = (l+1)*255/N;}//找到輪廓并將它們全部存儲為列表findContours(灰色,輪廓,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);矢量<點>約;//測試每個輪廓for( size_t i = 0; i 1000 & &isContourConvex(Mat(approx)) ){雙最大余弦 = 0;for( int j = 2; j <5; j++ ){//找到關節邊緣之間夾角的最大余弦值雙余弦 = fabs(angle(approx[j%4],approx[j-2],approx[j-1]));maxCosine = MAX(maxCosine, cosine);}//如果所有角度的余弦都很小//(所有角度都是~90度)然后寫quandrange//頂點到結果序列如果(最大余弦<0.3)squares.push_back(大約);}}}}}//該函數繪制圖像中的所有方塊void drawSquares( Mat& image, const vector<vector<Point> >& squares ){for( size_t i = 0; i < squares.size(); i++ ){const Point* p = &squares[i][0];int n = (int)squares[i].size();polylines(image, &p, &n, 1, true, Scalar(0,255,0), 3, CV_AA);}imshow(wndname,圖像);}int main(int argc, char** argv){如果 (argc <2){cout<<用法:./program <文件>"<<結束;返回-1;}//static const char* names[] = { "pic1.png", "pic2.png", "pic3.png",//"pic4.png", "pic5.png", "pic6.png", 0 };靜態常量字符*名稱[] = { argv[1], 0 };幫助();命名窗口( wndname, 1 );矢量<矢量<點>>正方形;for( int i = 0; names[i] != 0; i++ ){Mat image = imread(names[i], 1);如果(圖像.空()){cout<<無法加載" <<名稱[i] <<結束;繼續;}findSquares(圖像,正方形);drawSquares(圖像,正方形);imwrite("out.jpg", image);int c = waitKey();如果((字符)c == 27 )休息;}返回0;}

輸出:

I'm using the program squares.c available in the samples of OpenCV libraries. It works well with every image, but I really can't figure it out why it doesn't recognize the square drawn in that image

http://desmond.imageshack.us/Himg12/scaled.php?server=12&filename=26725680.jpg&res=medium

After CANNY:

After DILATE:

The RESULT image (in red) http://img267.imageshack.us/img267/8016/resultuq.jpg

As you can see, the square is NOT detected.

After the detection I need to extract the area contained in the square...How is it possible without a ROI?

解決方案

The source code below presents a small variation of the Square Detector program. It's not perfect, but it illustrates one way to approach your problem.

You can diff this code to the original and check all the changes that were made, but the main ones are:

  • Decrease the number of threshold levels to 2.

  • In the beginning of findSquares(), dilate the image to detect the thin white square, and then blur the entire image so the algorithm doesn't detect the sea and the sky as individual squares.

Once compiled, run the application with the following syntax: ./app <image>

// The "Square Detector" program.
// It loads several images sequentially and tries to find squares in
// each image

#include "highgui.h"
#include "cv.h"

#include <iostream>
#include <math.h>
#include <string.h>

using namespace cv;
using namespace std;

void help()
{
        cout <<
        "
A program using pyramid scaling, Canny, contours, contour simpification and
"
        "memory storage (it's got it all folks) to find
"
        "squares in a list of images pic1-6.png
"
        "Returns sequence of squares detected on the image.
"
        "the sequence is stored in the specified memory storage
"
        "Call:
"
        "./squares
"
    "Using OpenCV version %s
" << CV_VERSION << "
" << endl;
}


int thresh = 50, N = 2; // karlphillip: decreased N to 2, was 11.
const char* wndname = "Square Detection Demo";

// helper function:
// finds a cosine of angle between vectors
// from pt0->pt1 and from pt0->pt2
double angle( Point pt1, Point pt2, Point pt0 )
{
    double dx1 = pt1.x - pt0.x;
    double dy1 = pt1.y - pt0.y;
    double dx2 = pt2.x - pt0.x;
    double dy2 = pt2.y - pt0.y;
    return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}

// returns sequence of squares detected on the image.
// the sequence is stored in the specified memory storage
void findSquares( const Mat& image, vector<vector<Point> >& squares )
{
    squares.clear();

    Mat pyr, timg, gray0(image.size(), CV_8U), gray;

    // karlphillip: dilate the image so this technique can detect the white square,
    Mat out(image);
    dilate(out, out, Mat(), Point(-1,-1));
    // then blur it so that the ocean/sea become one big segment to avoid detecting them as 2 big squares.
    medianBlur(out, out, 7);

    // down-scale and upscale the image to filter out the noise
    pyrDown(out, pyr, Size(out.cols/2, out.rows/2));
    pyrUp(pyr, timg, out.size());
    vector<vector<Point> > contours;

    // find squares in every color plane of the image
    for( int c = 0; c < 3; c++ )
    {
        int ch[] = {c, 0};
        mixChannels(&timg, 1, &gray0, 1, ch, 1);

        // try several threshold levels
        for( int l = 0; l < N; l++ )
        {
            // hack: use Canny instead of zero threshold level.
            // Canny helps to catch squares with gradient shading
            if( l == 0 )
            {
                // apply Canny. Take the upper threshold from slider
                // and set the lower to 0 (which forces edges merging)
                Canny(gray0, gray, 0, thresh, 5);
                // dilate canny output to remove potential
                // holes between edge segments
                dilate(gray, gray, Mat(), Point(-1,-1));
            }
            else
            {
                // apply threshold if l!=0:
                //     tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0
                gray = gray0 >= (l+1)*255/N;
            }

            // find contours and store them all as a list
            findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

            vector<Point> approx;

            // test each contour
            for( size_t i = 0; i < contours.size(); i++ )
            {
                // approximate contour with accuracy proportional
                // to the contour perimeter
                approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);

                // square contours should have 4 vertices after approximation
                // relatively large area (to filter out noisy contours)
                // and be convex.
                // Note: absolute value of an area is used because
                // area may be positive or negative - in accordance with the
                // contour orientation
                if( approx.size() == 4 &&
                    fabs(contourArea(Mat(approx))) > 1000 &&
                    isContourConvex(Mat(approx)) )
                {
                    double maxCosine = 0;

                    for( int j = 2; j < 5; j++ )
                    {
                        // find the maximum cosine of the angle between joint edges
                        double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
                        maxCosine = MAX(maxCosine, cosine);
                    }

                    // if cosines of all angles are small
                    // (all angles are ~90 degree) then write quandrange
                    // vertices to resultant sequence
                    if( maxCosine < 0.3 )
                        squares.push_back(approx);
                }
            }
        }
    }
}


// the function draws all the squares in the image
void drawSquares( Mat& image, const vector<vector<Point> >& squares )
{
    for( size_t i = 0; i < squares.size(); i++ )
    {
        const Point* p = &squares[i][0];
        int n = (int)squares[i].size();
        polylines(image, &p, &n, 1, true, Scalar(0,255,0), 3, CV_AA);
    }

    imshow(wndname, image);
}


int main(int argc, char** argv)
{
    if (argc < 2)
    {
        cout << "Usage: ./program <file>" << endl;
        return -1;
    }

//    static const char* names[] = { "pic1.png", "pic2.png", "pic3.png",
//        "pic4.png", "pic5.png", "pic6.png", 0 };
    static const char* names[] = { argv[1], 0 };

    help();
    namedWindow( wndname, 1 );
    vector<vector<Point> > squares;

    for( int i = 0; names[i] != 0; i++ )
    {
        Mat image = imread(names[i], 1);
        if( image.empty() )
        {
            cout << "Couldn't load " << names[i] << endl;
            continue;
        }

        findSquares(image, squares);
        drawSquares(image, squares);
        imwrite("out.jpg", image);

        int c = waitKey();
        if( (char)c == 27 )
            break;
    }

    return 0;
}

Outputs:

這篇關于正方形檢測沒有找到正方形的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Assertion failed (size.widthgt;0 amp;amp; size.heightgt;0)(斷言失敗(size.width0 amp;amp; size.height0))
Rotate an image in C++ without using OpenCV functions(在 C++ 中旋轉圖像而不使用 OpenCV 函數)
OpenCV: process every frame(OpenCV:處理每一幀)
Why can#39;t I open avi video in openCV?(為什么我不能在 openCV 中打開 avi 視頻?)
OpenCV unable to set up SVM Parameters(OpenCV 無法設置 SVM 參數)
Convert a single color with cvtColor(使用 cvtColor 轉換單一顏色)
主站蜘蛛池模板: 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 衬塑管道_衬四氟管道厂家-淄博恒固化工设备有限公司 | 河南膏药贴牌-膏药代加工-膏药oem厂家-洛阳今世康医药科技有限公司 | 二维运动混料机,加热型混料机,干粉混料机-南京腾阳干燥设备厂 | 飞利浦LED体育场灯具-吸顶式油站灯-飞利浦LED罩棚灯-佛山嘉耀照明有限公司 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 消防设施操作员考试报名时间,报名入口,报考条件 | 自动气象站_农业气象站_超声波气象站_防爆气象站-山东万象环境科技有限公司 | 江门流水线|江门工作台|江门市伟涛行工业设备有限公司 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 海日牌清洗剂-打造带电清洗剂、工业清洗剂等清洗剂国内一线品牌 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 | 冷水机-工业冷水机-冷水机组-欧科隆品牌保障 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 武汉宣传片制作-视频拍摄-企业宣传片公司-武汉红年影视 | 热风机_工业热风机生产厂家上海冠顶公司提供专业热风机图片价格实惠 | 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 自动气象站_气象站监测设备_全自动气象站设备_雨量监测站-山东风途物联网 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 奥运星-汽车性能网评-提供个性化汽车资讯 | 校园文化空间设计-数字化|中医文化空间设计-党建|法治廉政主题文化空间施工-山东锐尚文化传播公司 | 双舌接地线-PC68数字式高阻计-ZC36|苏海百科 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 制冷采购电子商务平台——制冷大市场 | 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 智能风向风速仪,风速告警仪,数字温湿仪,综合气象仪(气象五要素)-上海风云气象仪器有限公司 | 无线对讲-无线对讲系统解决方案-重庆畅博通信| 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 |