1. 程式人生 > >利用opencv檢測出矩形1

利用opencv檢測出矩形1

利用opencv檢測出矩形

//#include "stdafx.h"  
#include <opencv2/opencv.hpp>
#include <iostream>
#include <windows.h>
using namespace cv;
using namespace std;


int* findRectInfo(std::vector<cv::Point> rect)
    {
    int rectInfo[4] = {0};
    int x[4]= {0},y[4]= {0};
    int maxX = 0
,maxY = 0,minX = 2000,minY = 2000; //get the rect points for(int i=0;i<4;i++) { x[i] = rect[i].x; y[i] = rect[i].y; if(maxX<x[i]) maxX = x[i]; if(maxY<y[i]) maxY = y[i]; if(minX>x[i]) minX = x[i]; if(minY>y[i]) minY = y[i]; } rectInfo[0
] = minY; rectInfo[1] = minX; rectInfo[2] = maxY - minY; rectInfo[3] = maxX - minX; cout<<"minY="<<minY<<endl; cout<<"minX="<<minX<<endl; cout<<"maxY - minY="<<maxY - minY<<endl; cout<<"maxX - minX="<<maxX - minX<<endl; return
rectInfo;// 得到矩形的左上角的座標和矩形的邊長 } 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); }//勾股定理驗證是否滿足直角的關係 int main(int argc, char* argv[]) { VideoCapture cap; cap.open(0); if (!cap.isOpened()) { return -1; } double w = 320, h = 320; cap.set(CV_CAP_PROP_FRAME_WIDTH, w); cap.set(CV_CAP_PROP_FRAME_HEIGHT, h); namedWindow("Video"); bool stop = false; Mat frame1,frame2,frame3; //IplImage* image; CvMemStorage* storage = NULL; while (!stop) { cap>> frame1; //image = &IplImage(frame); //IplImage *img1 = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); cvtColor(frame1, frame2, CV_BGR2GRAY); GaussianBlur(frame2, frame3, cv::Size(5, 5), 0, 0); //cvShowImage("AV", img1); // Quantize the gray scale to 30 levels int gbins = 16; int histSize[] = { gbins }; // gray scale varies from 0 to 256 float granges[] = { 0,256 }; const float* ranges[] = { granges }; cv::MatND hist; // we compute the histogram from the 0-th and 1-st channels int channels[] = { 0 }; //calculate hist calcHist(&frame2, 1, channels, cv::Mat(), // do not use mask hist, 1, histSize, ranges, true, // the histogram is uniform false); //find the max value of hist double maxVal = 0; minMaxLoc(hist, 0, &maxVal, 0, 0); int scale = 20; cv::Mat histImg; histImg.create(500, gbins*scale, CV_8UC3); //show gray scale of hist image for (int g = 0; g<gbins; g++) { float binVal = hist.at<float>(g, 0); int intensity = cvRound(binVal * 255); rectangle(histImg, cv::Point(g*scale, 0), cv::Point((g + 1)*scale - 1, binVal / maxVal * 400), CV_RGB(0, 0, 0), CV_FILLED); } imshow("histImg", histImg); // processing Mat hsvRe; threshold(frame3, hsvRe, 150, 255, cv::THRESH_BINARY);//閾值設定函式 形式:void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type ); vector<vector<Point>> contours; //contours指所有輪廓 vector<Vec4i> hierarchy; // find findContours(hsvRe, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);//找出圖片中的所有輪廓 // draw //Mat result(hsvRe.size(), CV_8U, Scalar(0)); //drawContours(result, contours, -1, Scalar(255), 2); //namedWindow("contours"); //imshow("contours", result); imshow("Video1", frame1); imshow("Video2", frame2); imshow("Video3", hsvRe); //.......................識別矩形.................................................//. vector<Point> approx; vector<vector<Point>> squares; for (size_t i = 0; i < contours.size(); i++)//表示所有的輪廓 { approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true); if (approx.size() == 4 && fabs(contourArea(Mat(approx))) > 1000 && isContourConvex(Mat(approx))) { double maxCosine = 0; for( int j = 2; j < 5; j++ ) { double cosine = fabs(angle(approx[j%4],approx[j-2], approx[j-1])); maxCosine = MAX(maxCosine, cosine); } if( maxCosine < 0.1 ) squares.push_back(approx); } } //...........................get rect from image........................................... std::vector<int> compression_params; compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); compression_params.push_back(9); Mat image(3210,3210,CV_8UC3,Scalar(0)); for(int i=0;i<squares.size();i++) { int rect[4],*tmp; tmp = findRectInfo(squares[i]); cout<<i<<endl; for(int j=0;j<4;j++) { rect[j] = *(tmp+j); } cv::Rect roi(rect[1],rect[0],rect[3],rect[2]); cout<<"w:"<<roi.width<<endl; cout<<"w:"<<roi.height<<endl; //cv::Mat roi_of_image = image(roi); } /*char * filename = new char[100]; sprintf(filename,"F:\\Temp\\%i.png",i); imshow("Video4", roi_of_image); cv::imwrite(filename,roi_of_image,compression_params);*/ /* }*/ //............................... //storage = cvCreateMemStorage(0); //cvNamedWindow(wndname, 1); // find and draw the squares //cvReleaseImage(&image); //cvClearMemStorage(storage); if (waitKey(27) >= 0)//Esc鍵退出 stop = true; } return 0; }
 這個程式是自己在網上各種查閱和拼湊在一起能檢測出矩形的程式。

相關推薦

利用opencv檢測矩形1

利用opencv檢測出矩形 //#include "stdafx.h" #include <opencv2/opencv.hpp> #include <iostream> #include <windows.h

將影象扭正確。利用OpenCV檢測影象中的長方形畫布或紙張並提取影象內容

也就是在一張照片裡,已知有個長方形的物體,但是經過了透視投影,已經不再是規則的長方形,那麼如何提取這個圖形裡的內容呢?這是個很常見的場景,比如在博物館裡看到一幅很喜歡的畫,用手機找了下來,可是回家一看歪歪斜斜,腦補原畫內容又覺得不對,那麼就需要演算法輔助來從原圖裡提取原來的內容了。不妨把應用的場景分為以下

USGS-EROS項目espa-surface-reflectance中的LaSRC Version 1.3.0模塊利用vs2010編譯windows64位版本(一)

product 發現 jpeg git clone args dcl 函數 中一 比較 Landsat8衛星的大氣校正目前國內有很多學者都在做,隨便百度一下就能找到很多論文,提出的算法都有各自的亮點,學術研究上都有意義。 但是,問題來了,如果要真正拿出來處理任意一幅La

USGS-EROS項目espa-surface-reflectance中的LaSRC Version 1.3.0模塊利用vs2010編譯windows64位版本的使用(三)

合成 ast mage files 關系 分享 一周 com window Landsat8大氣校正程序LaSRC是目前最好的,使用方式也夠傻瓜,輸入文件輸出結果。 但有一個限制,就是程序需要預先下載好的MODIS輔助文件來確定水汽、壓強等大氣參數。 如果待大氣校正的l

0049-利用OpenCV的HOG類進行行人區域的檢測

一個物體,不管遠近以及角度如何,我們人都能判斷為同一物體,因為我們人腦是根據物體的特徵來判斷是不是同一物體的,計算機在處理影象時,我們也希望具備這樣的能力,所以需要對影象進行特徵提取。 HOG(Histogram of Oriented Gridients的簡寫)特徵檢測演算法,最早是由法國研究

《程式設計珠璣》程式碼之路12:如何用C/C++實現array[-1]並利用它寫優美的程式碼

我們就以最大子陣列和為例: 最大子段和問題:給一組數,計算最大子段和。 在部落格:最大欄位和的6種解法,解法三中,我們提到了儲存前i項和的操作: cache[i]代表前i-1項之和,因為在c/c++中,cache[-1]會越界,所以如果用cache[i]代表前i項和的話,那麼在用遞推公式

Linux系統下利用OpenCV實現人臉檢測和基於LBPH演算法的人臉識別

        本文主要的目的是進行人臉檢測和人臉識別。實驗環境為Ubuntu16.04 LTS虛擬機器版,技術為OpenCV,語言為c++。其中人臉檢測的主要過程是從一張圖片中檢測出人臉可以是一個或者是多個,然後用矩形或者圓形線圈標註出來。人臉識別是基於LBPH演算法實現

OPENCV檢測矩形並計算其中心

#include "cv.h"   #include "highgui.h"   #include <stdio.h>   #include <math.h>   #include <string.h>      #pragma comm

利用OpenCV實現人眼的檢測與跟蹤

程式實現思路如下: 利用級聯分類器檢測出人臉區域,再在人臉區域中檢測出眼睛的區域,檢測出眼睛的區域之後,用跟蹤演算法咔嚓眼睛降低運算量,避免每一幀都去檢測眼睛。 程式碼如下: 程式碼執行結果如下圖所示: 上圖表示偏頭時程式會跟蹤眼睛!

利用opencv實現人臉檢測(C++版)

小編所有的帖子都是基於unbuntu系統的,當然稍作修改同樣試用於windows的,經過小編的絞盡腦汁,把剛剛發的那篇python 實現人臉和眼睛的檢測的程式用C++ 實現了,當然,也參考了不少大神的部落格,下面我們就一起來看看: Linux系統下安裝open

利用OpenCV和深度學習實現人臉檢測

// Summary: 使用OpenCV3.3.1中的face_detector // Author: Amusi // Date: 2018-02-28 // Reference: http://blog.csdn.net/minstyrain/article/details/78907425 #in

1.建立一個Rectangle類,新增width和height兩個成員變數。 2.在Rectangle中新增兩種方法分別計算矩形的周長和麵積 3.程式設計利用Rectangle輸出一個矩形的周

/* * 1.建立一個Rectangle類,新增width和height兩個成員變數。 * 2.在Rectangle中新增兩種方法分別計算矩形的周長和麵積 * 3.程式設計利用Rectangle輸出一個矩形的周長和麵積 */ public class ke1 {//

opencv 檢測直線、線段、圓、矩形

檢測直線:cvHoughLines,cvHoughLines2 檢測圓:cvHoughCircles 檢測矩形:opencv中沒有對應的函式,下面有段程式碼可以檢測矩形,是通過先找直線,然後找到直線平行與垂直的四根線。 檢測直線程式碼: /* This is

實用的OpenCV程式碼片段(1)-- 利用Boost將cv::Mat序列化

如何將cv::Mat型別序列化 使用Boost的serialization庫。 官方說明在這裡 下面就是採用的非入侵方法給Mat增加序列化功能的程式碼 #include <open

OpenCV最小外接矩形

慣例先放結果吧 測試圖片盜取自:  地址  (2333) 其實就一行關鍵的程式碼: RotatedRect rect = minAreaRect(contours[i]);下面就是簡單粗暴的程

opencv 檢測直線 線段 圓 矩形

ali 精確 parameter who als 起點 closed 註意 內存空間 轉自:http://blog.csdn.net/byxdaz/archive/2009/12/01/4912136.aspx 檢測直線:cvHoughLines,cvHoughLin

利用OpenCV-python進行直線檢測

 最近需要利用攝像頭對細小的偏移做矯正,由於之前的介面工具是用 PyQT 所寫,在當前的工具中加入攝像頭矯正程式,也打算用 python 直接完成。OpenCV 簡介:Python 處理影象有 OpenCV 庫。OpenCV 可以執行在 Linux,windows,macOS

在android平臺上利用opencv進行影象處理之邊沿檢測

由於專案的需要,這幾天開始接觸opencv,要在android平臺上利用opencv進行影象處理。以下是這幾天的成果: 執行結果如下: 原始圖片: 處理後的圖片: Java程式碼: package com.cdq.opencvtest; import java.

1.建立一個Rectangle類,新增width和height兩個成員變數。 2.在Rectangle中新增兩種方法分別計算矩形的周長和麵積 3.程式設計利用Rectangle輸出一個矩形的周

/*  * 1.建立一個Rectangle類,新增width和height兩個成員變數。  * 2.在Rectangle中新增兩種方法分別計算矩形的周長和麵積  * 3.程式設計利用Rectangle輸出一個矩形的周長和麵積  */ public class Rectang

檢測的人臉用橢圓和矩形框畫

把檢測出的人臉用橢圓畫出。使用opencv中自帶的haarcascades <pre name="code" class="cpp"><pre name="code" class="cpp">#include "opencv2/core/core.