opencv找手机边框

    xiaoxiao2021-12-14  22

    // findCircle.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <math.h> #include <iostream> //#include "cxcore.h" //#include "img_proc.h" //#pragma comment( lib, "opencv_highgui2413d.lib") //#pragma comment( lib, "opencv_core2413d.lib") using namespace std; int main() { IplImage *img = cvLoadImage("D:\\1\\2.bmp", 1);//原图 CvPoint leftCenter,rightCenter;    //用来存贮(手机)左右两个mark点,(图中的上下) CvRect leftMarkROI; leftMarkROI.x = 980; leftMarkROI.y = 1500; leftMarkROI.height = 300; leftMarkROI.width = 500; CvPoint leftMarkROI_point[4]; //getRect4Point(m_roi, roi_point); leftMarkROI_point[0].x = leftMarkROI.x; leftMarkROI_point[0].y = leftMarkROI.y; leftMarkROI_point[1].x = leftMarkROI.x; leftMarkROI_point[1].y = leftMarkROI.y + leftMarkROI.height; leftMarkROI_point[2].x = leftMarkROI.x + leftMarkROI.width; leftMarkROI_point[2].y = leftMarkROI.y; leftMarkROI_point[3].x = leftMarkROI.x + leftMarkROI.width; leftMarkROI_point[3].y = leftMarkROI.y + leftMarkROI.height; //cvLine(m_SrcImg,m_roi.x) //画出一个 ROI 区域的矩形 cvLine(img, leftMarkROI_point[0], leftMarkROI_point[1], CV_RGB(255, 0, 0), 2, 2); cvLine(img, leftMarkROI_point[1], leftMarkROI_point[3], CV_RGB(255, 0, 0), 2, 2); cvLine(img, leftMarkROI_point[3], leftMarkROI_point[2], CV_RGB(255, 0, 0), 2, 2); cvLine(img, leftMarkROI_point[2], leftMarkROI_point[0], CV_RGB(255, 0, 0), 2, 2); cvSetImageROI(img, leftMarkROI); //设置ROI IplImage* grayLeft = cvCreateImage(cvGetSize(img), 8, 1); CvMemStorage* storageLeft = cvCreateMemStorage(0); cvCvtColor(img, grayLeft, CV_BGR2GRAY); cvSmooth(grayLeft, grayLeft, CV_GAUSSIAN, 9, 9); // smooth it, otherwise a lot of false circles may be detected CvSeq* circlesLeft = cvHoughCircles(grayLeft, storageLeft, CV_HOUGH_GRADIENT, 2, grayLeft->height / 4, 200, 100); for (int i = 0; i < circlesLeft->total; i++) { float* p = (float*)cvGetSeqElem(circlesLeft, i); leftCenter.x = cvRound(p[0]); leftCenter.y = cvRound(p[1]); //cvCircle(img, cvPoint(cvRound(p[0]), cvRound(p[1])), 2, CV_RGB(0, 255, 0), -1, 8, 0); cvCircle(img, leftCenter, 2, CV_RGB(0, 255, 0), -1, 8, 0); //cvCircle(img, cvPoint(cvRound(p[0]), cvRound(p[1])), cvRound(p[2]), CV_RGB(255, 0, 0), 3, 8, 0); cvCircle(img, leftCenter, cvRound(p[2]), CV_RGB(255, 0, 0), 3, 8, 0); } cvResetImageROI(img); CvRect rightMarkROI; rightMarkROI.x = 980; rightMarkROI.y = 200; rightMarkROI.height = 300; rightMarkROI.width = 500; CvPoint rightMarkROI_point[4]; //getRect4Point(m_roi, roi_point); rightMarkROI_point[0].x = rightMarkROI.x; rightMarkROI_point[0].y = rightMarkROI.y; rightMarkROI_point[1].x = rightMarkROI.x; rightMarkROI_point[1].y = rightMarkROI.y + rightMarkROI.height; rightMarkROI_point[2].x = rightMarkROI.x + rightMarkROI.width; rightMarkROI_point[2].y = rightMarkROI.y; rightMarkROI_point[3].x = rightMarkROI.x + rightMarkROI.width; rightMarkROI_point[3].y = rightMarkROI.y + rightMarkROI.height; //cvLine(m_SrcImg,m_roi.x) //画出一个 ROI 区域的矩形 cvLine(img, rightMarkROI_point[0], rightMarkROI_point[1], CV_RGB(255, 0, 0), 2, 2); cvLine(img, rightMarkROI_point[1], rightMarkROI_point[3], CV_RGB(255, 0, 0), 2, 2); cvLine(img, rightMarkROI_point[3], rightMarkROI_point[2], CV_RGB(255, 0, 0), 2, 2); cvLine(img, rightMarkROI_point[2], rightMarkROI_point[0], CV_RGB(255, 0, 0), 2, 2); cvSetImageROI(img, rightMarkROI); //设置ROI IplImage* grayRight = cvCreateImage(cvGetSize(img), 8, 1); CvMemStorage* storageRight = cvCreateMemStorage(0); cvCvtColor(img, grayRight, CV_BGR2GRAY); cvSmooth(grayRight, grayRight, CV_GAUSSIAN, 9, 9); // smooth it, otherwise a lot of false circles may be detected CvSeq* circlesRight = cvHoughCircles(grayRight, storageRight, CV_HOUGH_GRADIENT, 2, grayRight->height / 4, 200, 100); for (int i = 0; i < circlesRight->total; i++) { float* p = (float*)cvGetSeqElem(circlesRight, i); rightCenter.x = cvRound(p[0]); rightCenter.y = cvRound(p[1]); //cvCircle(img, cvPoint(cvRound(p[0]), cvRound(p[1])), 2, CV_RGB(0, 255, 0), -1, 8, 0); cvCircle(img, rightCenter, 2, CV_RGB(0, 255, 0), -1, 8, 0); //cvCircle(img, cvPoint(cvRound(p[0]), cvRound(p[1])), cvRound(p[2]), CV_RGB(255, 0, 0), 3, 8, 0); cvCircle(img, rightCenter, cvRound(p[2]), CV_RGB(255, 0, 0), 3, 8, 0); } cvResetImageROI(img); leftCenter.x = leftCenter.x + leftMarkROI.x; leftCenter.y = leftCenter.y + leftMarkROI.y; rightCenter.x = rightCenter.x + rightMarkROI.x; rightCenter.y = rightCenter.y + rightMarkROI.y; cvLine(img, leftCenter, rightCenter, CV_RGB(0, 255, 0), 2, 2);   //连心线 //参考线 cvLine(img, cvPoint(rightCenter.x, leftCenter.y), rightCenter, CV_RGB(0, 0, 255), 2, 2);    cvLine(img, leftCenter,cvPoint(leftCenter.x, rightCenter.y), CV_RGB(0, 0, 255), 2, 2);    cvSaveImage("d:\\1\\91.bmp", img); cvNamedWindow("circles", CV_WINDOW_AUTOSIZE); cvShowImage("circles", img); cvWaitKey(0); cvReleaseImage(&img); return 0;

    }

    原图     :   

    处理后的  图像  为  : 

    转载请注明原文地址: https://ju.6miu.com/read-971217.html

    最新回复(0)