opencv 找手机边框

// 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;

}

大笑原图     :   











处理后的  图像  为  : 








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teleger

你的支持是我前进的方向

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值