亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

OpenCV 圓與矩形識別的方法

2020-01-26 13:26:21
字體:
來源:轉載
供稿:網友

最近一個項目用到了圖像識別,之前從未接觸過OpenCV,經過各種找教程,終于是搞懂了一些。

整個具體流程大概是獲取圖像-->圖像二值化,灰度圖(cvtColor)-->圖像降噪(GaussianBlur)->輪廓識別(cvFindContours)-->形狀判斷。

大多數教程很專業,各種參數分析看不懂,經過各種搜索終于是搞懂了。

識別圓

在識別圓方面,OpenCV有內置的方法:霍夫圓變化:

HoughCircles(edges, circles, CV_HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);

參數分析:

edges:灰度圖像

circles: std::vector<Vec3f> circles;數組,用來存儲圓的坐標信息

CV_HOUGH_GRADIENT:Hough 變換方式,目前只支持CV_HOUGH_GRADIENT, which is basically 21HT, described in [Yuen03].默認用這個

1.5:累加器圖像的分辨率,1的時候是與獲取到的圖像相同,1.5就是1.5倍

10:圓與圓的最小距離,兩個圓心距離如果在范圍內則被認定為1個圓

200:100-200兩個參數選就夠了

100:默認100,數值越低識別圓越不精確(圓的數量識別變多可能有個弧線就被識別是圓)

最后兩個參數分別是識別 圓的最小,最大的面積。

矩形識別

矩形識別并沒有內置方法,需要自己手寫。

最主要的方法是二值化。通過二值化來調節識別的強度。

cvThreshold(tgray, gray, 75, 250, CV_THRESH_BINARY);

參數分析:

src:原始數組 (單通道 , 8-bit of 32-bit 浮點數)。

dst:輸出數組,必須與 src 的類型一致,或者為 8-bit。

threshold:閾值

max_value:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。

threshold_type:閾值類型

threshold_type=CV_THRESH_BINARY:如果 src(x,y)>threshold ,dst(x,y) = max_value; 否則,dst(x,y)=0;

threshold_type=CV_THRESH_BINARY_INV:如果 src(x,y)>threshold,dst(x,y) = 0; 否則,dst(x,y) = max_value.

threshold_type=CV_THRESH_TRUNC:如果 src(x,y)>threshold,dst(x,y) = max_value; 否則dst(x,y) = src(x,y).

threshold_type=CV_THRESH_TOZERO:如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否則 dst(x,y) = 0。

threshold_type=CV_THRESH_TOZERO_INV:如果 src(x,y)>threshold,dst(x,y) = 0 ; 否則dst(x,y) = src(x,y).

效果圖如下:

在矩形識別里面的二值化圖:

圓識別:

源碼:

#include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <WINSOCK2.H>#include<iostream>#include<thread>#include <winsock2.h>#include <stdio.h>#include<string>#include <windows.h>#pragma comment(lib,"ws2_32.lib")#include<vector> using namespace cv;     //////////////////////////////////////////////////////////////////   //函數功能:用向量來做COSα=兩向量之積/兩向量模的乘積求兩條線段夾角   //輸入:  線段3個點坐標pt1,pt2,pt0,最后一個參數為公共點   //輸出:  線段夾角,單位為角度   //////////////////////////////////////////////////////////////////double angle(CvPoint* pt1, CvPoint* pt2, CvPoint* 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; double angle_line = (dx1*dx2 + dy1 * dy2) / sqrt((dx1*dx1 + dy1 * dy1)*(dx2*dx2 + dy2 * dy2) + 1e-10);//余弦值 return acos(angle_line) * 180 / 3.141592653;}////////////////////////////////////////////////////////////////////函數功能:采用多邊形檢測,通過約束條件尋找矩形//輸入:  img 原圖像//     storage 存儲//     minarea,maxarea 檢測矩形的最小/最大面積//     minangle,maxangle 檢測矩形邊夾角范圍,單位為角度//輸出:  矩形序列//////////////////////////////////////////////////////////////////CvSeq* findSquares4(IplImage* img, CvMemStorage* storage, int minarea, int maxarea, int minangle, int maxangle, int(&temp)[30]){ CvSeq* contours;//邊緣 int N = 6; //閾值分級 CvSize sz = cvSize(img->width & -2, img->height & -2); IplImage* timg = cvCloneImage(img);//拷貝一次img IplImage* gray = cvCreateImage(sz, 8, 1); //img灰度圖 IplImage* pyr = cvCreateImage(cvSize(sz.width / 2, sz.height / 2), 8, 3); //金字塔濾波3通道圖像中間變量 IplImage* tgray = cvCreateImage(sz, 8, 1); ; CvSeq* result; double s, t; int sk = 0; CvSeq* squares = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvPoint), storage);  cvSetImageROI(timg, cvRect(0, 0, sz.width, sz.height)); //金字塔濾波  cvPyrDown(timg, pyr, 7); cvPyrUp(pyr, timg, 7); //在3個通道中尋找矩形  for (int c = 0; c < 3; c++) //對3個通道分別進行處理  { cvSetImageCOI(timg, c + 1); cvCopy(timg, tgray, 0); //依次將BGR通道送入tgray      for (int l = 0; l < N; l++) {  //不同閾值下二值化  cvThreshold(tgray, gray, 75, 250, CV_THRESH_BINARY);  cvShowImage("111", gray);  cvFindContours(gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));  while (contours)  { //多邊形逼近         result = cvApproxPoly(contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0);   //如果是凸四邊形并且面積在范圍內   if (result->total == 4 && fabs(cvContourArea(result, CV_WHOLE_SEQ)) > minarea && fabs(cvContourArea(result, CV_WHOLE_SEQ)) < maxarea && cvCheckContourConvexity(result))  {    s = 0;   //判斷每一條邊   for (int i = 0; i < 5; i++)   {   if (i >= 2)   {  //角度          t = fabs(angle((CvPoint*)cvGetSeqElem(result, i), (CvPoint*)cvGetSeqElem(result, i - 2), (CvPoint*)cvGetSeqElem(result, i - 1)));    s = s > t ? s : t;   }   }   //這里的S為直角判定條件 單位為角度   if (s > minangle && s < maxangle)   {   for (int i = 0; i < 4; i++)    cvSeqPush(squares, (CvPoint*)cvGetSeqElem(result, i));   CvRect rect = cvBoundingRect(contours, 1);    // 獲取矩形邊界框    CvPoint p1;   p1 = cvPoint(rect.x + rect.width / 2, rect.y + rect.height / 2);  //矩形中心坐標    std::cout << "X:" << p1.x << "Y:" << p1.y << std::endl;   }  }  contours = contours->h_next;  } } std::cout << "圓的數量是"<<sk << std::endl; temp[26] = sk;   sk = 0; } cvReleaseImage(&gray); cvReleaseImage(&pyr); cvReleaseImage(&tgray); cvReleaseImage(&timg);  return squares;}////////////////////////////////////////////////////////////////////函數功能:畫出所有矩形//輸入:  img 原圖像//     squares 矩形序列//     wndname 窗口名稱//輸出:  圖像中標記矩形//////////////////////////////////////////////////////////////////void drawSquares(IplImage* img, CvSeq* squares, const char* wndname){ CvSeqReader reader; IplImage* cpy = cvCloneImage(img); CvPoint pt[4]; int i; cvStartReadSeq(squares, &reader, 0); for (i = 0; i < squares->total; i += 4) { CvPoint* rect = pt; int count = 4; memcpy(pt, reader.ptr, squares->elem_size); CV_NEXT_SEQ_ELEM(squares->elem_size, reader); memcpy(pt + 1, reader.ptr, squares->elem_size); CV_NEXT_SEQ_ELEM(squares->elem_size, reader); memcpy(pt + 2, reader.ptr, squares->elem_size); CV_NEXT_SEQ_ELEM(squares->elem_size, reader); memcpy(pt + 3, reader.ptr, squares->elem_size); CV_NEXT_SEQ_ELEM(squares->elem_size, reader); //cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 ); cvPolyLine(cpy, &rect, &count, 1, 1, CV_RGB(rand() & 255, rand() & 255, rand() & 255), 1, CV_AA, 0);//彩色繪制 } cvShowImage("22", cpy); cvReleaseImage(&cpy);} void SendMessageOne(){ //開起攝像頭 VideoCapture capture; capture.open(0); Mat edges; //定義轉化的灰度圖 if (!capture.isOpened()) namedWindow("【效果圖】", CV_WINDOW_NORMAL); const char* winn = "1111"; if (!capture.isOpened()) //namedWindow(winn, CV_WINDOW_NORMAL); CvMemStorage* storage = 0; CvMemStorage* storage = 0; storage = cvCreateMemStorage(0); while (1) { int Y=0, J=0; Mat frame; capture >> frame; IplImage img0 = frame; //drawSquares(&img0, findSquares4(&img0, storage, 100, 2000, 80, 100, a), winn); //cvClearMemStorage(storage); //清空存儲 Mat E = frame(Range(1, 320), Range(1, 240)); cvtColor(frame, edges, CV_BGR2GRAY); //高斯濾波 GaussianBlur(edges, edges, Size(7, 7), 2, 2); std::vector<Vec3f> circles;//存儲每個圓的位置信息      //霍夫圓 HoughCircles(edges, circles, CV_HOUGH_GRADIENT, 1.5, 10, 100, 100, 0, 50); for (size_t i = 0; i < circles.size(); i++) {  Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));  int radius = cvRound(circles[i][2]);  //std::cout << "圓的X是" << circles[i][0] << "圓的Y是" << circles[i][1] << std:: endl;  //繪制圓輪廓   circle(frame, center, radius, Scalar(155, 50, 255), 3, 8, 0);  int R = frame.at<Vec3b>(cvRound(circles[i][1]), cvRound(circles[i][0]))[2];//R  int G = frame.at<Vec3b>(cvRound(circles[i][1]), cvRound(circles[i][0]))[1];//G  int B = frame.at<Vec3b>(cvRound(circles[i][1]), cvRound(circles[i][0]))[0];//B  int num = R + G + B;  std::cout << "圓心顏色是" << num << std::endl;        }  imshow("【效果圖】", frame); waitKey(30); }} int main(){ std::thread *a = new std::thread(SendMessageOne); a->join();  return 0;}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
2019中文字幕在线免费观看| 久久久久久久国产精品| 欧美激情视频播放| 亚洲欧洲在线观看| 久久不射电影网| 秋霞午夜一区二区| 国产又爽又黄的激情精品视频| 亚洲欧美制服另类日韩| 91高清在线免费观看| 国产激情久久久久| 国产午夜精品理论片a级探花| 97视频在线观看播放| 亚洲色图色老头| 亚洲成人教育av| 欧美大学生性色视频| 亚洲成人aaa| 欧美激情精品久久久久久久变态| 中文字幕在线看视频国产欧美在线看完整| 亚洲娇小xxxx欧美娇小| 国产精品视频久久| 亚洲综合中文字幕在线观看| 日韩成人av一区| 久久激情五月丁香伊人| 日韩中文第一页| 久久久久在线观看| 国产免费成人av| 成人乱人伦精品视频在线观看| 日韩av影片在线观看| 日韩美女在线播放| 国产日韩欧美在线观看| 久久久久久国产精品三级玉女聊斋| 国外成人在线播放| 91精品久久久久久久久久久久久久| 欧美丰满片xxx777| 91在线免费网站| 国产精品电影一区| 国产自产女人91一区在线观看| 欧美精品久久久久久久免费观看| 亚洲v日韩v综合v精品v| 亚洲免费电影在线观看| 亚洲成色777777女色窝| 91超碰中文字幕久久精品| 欧美高清在线观看| 欧美自拍大量在线观看| 日韩欧美亚洲成人| 久久久精品电影| 国外色69视频在线观看| 26uuu亚洲伊人春色| 欧美激情在线一区| 55夜色66夜色国产精品视频| 黄色成人在线免费| 成人福利在线视频| 国产激情视频一区| 91爱视频在线| 91亚洲精华国产精华| 免费91麻豆精品国产自产在线观看| 色多多国产成人永久免费网站| 国产成人精品免高潮在线观看| 日韩精品极品在线观看| 97超级碰在线看视频免费在线看| 一区二区三区视频免费在线观看| 在线免费观看羞羞视频一区二区| 国产午夜精品久久久| 国产主播欧美精品| 精品国产一区二区三区久久久| 日韩高清电影免费观看完整| 日韩黄色av网站| 成人午夜黄色影院| 国产综合视频在线观看| 亚州欧美日韩中文视频| 色婷婷成人综合| 久久久久久久久网站| 欧美在线观看视频| 91人人爽人人爽人人精88v| 国产精品av在线| 国产精欧美一区二区三区| 亚洲人成欧美中文字幕| 精品久久久中文| 日韩一区二区福利| 国产精品露脸自拍| 精品自拍视频在线观看| 国产精品va在线播放| 久久精品国产69国产精品亚洲| 97久久精品国产| 国产精品网站视频| 国产精品丝袜视频| 亚洲国产中文字幕久久网| www.欧美精品一二三区| 欧美视频免费在线| 中文字幕日韩在线观看| 久久精品99无色码中文字幕| 日韩欧美一区二区三区| 欧美色视频日本高清在线观看| 久久91亚洲精品中文字幕奶水| 国产不卡视频在线| 国产精品自产拍在线观看中文| 国产精品久久久久秋霞鲁丝| 日韩成人激情视频| 日韩亚洲欧美中文在线| 国产精彩精品视频| 国产成人亚洲综合91| 亚洲国产成人精品久久| 亚洲国产毛片完整版| 欧美日韩不卡合集视频| 色哟哟网站入口亚洲精品| 亚洲国产成人精品久久久国产成人一区| 欧美最猛性xxxxx(亚洲精品)| 成人激情av在线| 一区二区欧美在线| 国产999视频| 久久精品99无色码中文字幕| 欧美寡妇偷汉性猛交| 精品国产一区久久久| 91人人爽人人爽人人精88v| 日韩国产高清污视频在线观看| 亚洲美女久久久| 日韩中文在线视频| 欧美久久精品午夜青青大伊人| 97欧美精品一区二区三区| 欧美日韩电影在线观看| 91成人在线视频| 日韩中文字幕在线精品| 亚洲自拍中文字幕| 高清一区二区三区四区五区| 亚洲一区二区三区视频播放| 精品国产福利视频| 国外视频精品毛片| 亚洲人成电影在线播放| 亚洲第一福利在线观看| 国产精品美女免费视频| 一区二区三区视频免费在线观看| 国内偷自视频区视频综合| 亚洲精品99久久久久中文字幕| 精品自拍视频在线观看| 欧美怡红院视频一区二区三区| 国产脚交av在线一区二区| 亚洲毛片在线观看| 中文字幕日韩欧美在线| 欧美电影免费观看电视剧大全| 欧美激情成人在线视频| 欧美亚洲日本黄色| 国产成人在线一区二区| 久久久精品在线观看| 日韩精品在线观看网站| 亚洲精品美女在线观看播放| 欧美激情第三页| 国产日韩在线看片| 日韩美女免费线视频| 亚洲最大福利视频网站| 成人欧美一区二区三区在线| 在线日韩日本国产亚洲| 91麻豆桃色免费看| 亚洲欧美日韩精品久久奇米色影视| 精品国产31久久久久久| 欧美精品成人91久久久久久久| 中文字幕亚洲自拍| 久久国产精彩视频| 国产在线视频不卡| 亚洲第一免费播放区| 久久免费国产视频| 中文字幕欧美日韩va免费视频| 国产一区二区三区精品久久久| 国产精品久久久久久久久借妻| 亚洲欧美日韩区|