// 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;
//
#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;
}
原图 :
处理后的 图像 为 :