19,468
社区成员
发帖
与我相关
我的任务
分享
//此代码是打开摄像头的,并开启定时器
void CObject_DetectionDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
// 窗体打开,关闭的按扭
if (isStop == false)
{
if (!cap.isOpened())
{
MessageBox(L"Cannot open the cam!");
return;
}
GetDlgItem(IDC_BUTTON1)->SetWindowText(L"STOP");
SetTimer(1, 100, NULL);
isStop = true;
}
else
{
KillTimer(1);
GetDlgItem(IDC_BUTTON1)->SetWindowText(L"Open");
isStop = false;
}
}
//此代码是定时器的函数
void CObject_DetectionDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nIDEvent == 1)
{
Mat imgOrig;
cap.read(imgOrig);
CvvImage m_cvvimage;
//Mat 向 IplImage 强转
m_cvvimage.CopyOf(&IplImage(imgOrig));
m_cvvimage.DrawToHDC(hDC1, &rect1);
//对 Original 进行处理
Mat imgHSV;
Mat imgProc;
//convert the image to gray
cvtColor(imgOrig, imgHSV, COLOR_BGR2HSV);
//Threshold the image
hmin = m_slider1.GetPos() / 2;
hmax = m_slider2.GetPos() / 2;
smin = m_slider3.GetPos();
smax = m_slider4.GetPos();
vmin = m_slider5.GetPos();
vmax = m_slider6.GetPos();
inRange(imgHSV, cv::Scalar(hmin, smin, vmin), cv::Scalar(hmax, smax, vmax), imgProc);
//cvtColor(imgOrig, imgProc, CV_RGB2GRAY);
vector<Mat> contours(100);
Mat heirarchy;
cv::vector<cv::Point2i> center;
cv::vector<int> radius;
findContours(imgProc.clone(), contours, heirarchy, RETR_TREE, CHAIN_APPROX_NONE, cv::Point(0, 0));
for (int i = 0; i < contours.size(); i++)
{
Point2f c;
float r;
minEnclosingCircle(contours[i], c, r);
if (r >= 20)
{
center.push_back(c);
radius.push_back(r);
}
}
for (int i = 0; i < center.size(); i++)
{
circle(imgProc, center[i], radius[i], Scalar(255, 0, 0), 3);
}
m_cvvimage.CopyOf(&IplImage(imgProc), -1);
m_cvvimage.DrawToHDC(hDC2, &rect2);
}
CDialogEx::OnTimer(nIDEvent);
}