#include "mainwindow.h"
#include <QPainter>
#include <iostream>
#include <sstream>
#include <math.h>
using namespace std;
using namespace cv;
MainWindow :: MainWindow()
{
mainWindow = new QWidget;
this->setCentralWidget(mainWindow);
buttonStart = new QPushButton("START");
buttonStart->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
buttonStop = new QPushButton("STOP");
buttonStop->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
pictureCamera = new QLabel();
pictureProcess1 = new QLabel();
pictureCanny = new QLabel();
pictureProcess2 = new QLabel();
pCapture = cvCreateCameraCapture(1);
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_WIDTH,320);
cvSetCaptureProperty(pCapture,CV_CAP_PROP_FRAME_HEIGHT,240);
// pImage = cvQueryFrame(pCapture);
mainLayout = new QGridLayout;
mainLayout->addWidget(buttonStart,0,0,1,1);
mainLayout->addWidget(buttonStop,0,1,1,1);
mainLayout->addWidget(pictureCamera,1,0,5,5);
mainLayout->addWidget(pictureCanny,1,5,5,5);
mainLayout->addWidget(pictureProcess1,6,0,5,5);
mainLayout->addWidget(pictureProcess2,6,5,5,5);
mainWindow->setLayout(mainLayout);
QObject::connect(buttonStart,SIGNAL(clicked()),this,SLOT(startVideo()));
QObject::connect(buttonStop,SIGNAL(clicked()),this,SLOT(stopVideo()));
this->setWindowTitle("beaglebone opencv test~");
this->resize(QSize(600,300));
}
MainWindow :: ~MainWindow()
{
cvReleaseCapture(&pCapture);
mainWindow->deleteLater();
mainLayout->deleteLater();
buttonStart->deleteLater();
buttonStop->deleteLater();
pictureCamera->deleteLater();
pictureProcess1->deleteLater();
pictureProcess2->deleteLater();
}
void MainWindow::startVideo()
{
/*init*/
IplImage * pImage;
IplImage * grayImage;
IplImage * pProcessImage1;
IplImage * pProcessImage2;
//pImage = cvQueryFrame(pCapture);
pImage = cvLoadImage("test.PNG",1);
//pImage = cvLoadImage("133.png",1);
if(pImage != NULL)
{
// QImage showImage((const uchar *)pImage->imageData,pImage->width,pImage->height,pImage->widthStep,QImage::Format_RGB888);
// pictureCamera->setPixmap(QPixmap::fromImage(showImage));
//cvQueryFrame似乎不需要释放内存,释放反而会出错,监控似乎没有内存泄漏
//cvReleaseImage(&pImage);
pProcessImage1 = pImage;
pProcessImage2 = pImage;
grayImage = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
/*color threshold*/
unsigned char * data =(unsigned char *) pImage->imageData;
int step = pImage->widthStep;
int channels = pImage->nChannels;
int step2 = grayImage->widthStep;
for(int i=0;i<pImage->height;i++)
{
for(int j=0;j<pImage->width;j++)
{
unsigned char pixR,pixG,pixB;
pixB = data[i*step+j*channels];
pixG = data[i*step+j*channels+1];
pixR = data[i*step+j*channels+2];
#if 1
if((pixR>pixG) &&
(pixG>pixB) &&
(pixR <240) &&
(pixB > 60))
{
float tem = pixG;
tem /= (pixR+pixB);
float tem1 = pixR-pixB;
tem1 /= (pixG - pixB);
if((tem < 0.6) &&
(tem > 0.4 )&&
(tem1>1.01)&&
(tem1<4.5))
#else
if((pixR>pixG) &&
(pixR>pixB))// &&
// (pixR <230) &&
//(pixB > 100) )
{
float tem = pixR;
tem /= (pixG+pixB);
float tem2 = pixB+ pixR;
tem2 /= pixG;
if((tem < 0.67) &&
(tem > 0.52 ) &&
(tem2 <2.35) &&
(tem2 >1.85))
#endif
grayImage->imageData[i*step2+j] = 0xff;
else
grayImage->imageData[i*step2+j]= 0x00;
}
else
{
grayImage->imageData[i*step2+j] = 0x00;
}
}
}
QImage showImage((const uchar *)pImage->imageData,pImage->width,pImage->height,pImage->widthStep,QImage::Format_RGB888);
QImage showGrayImage((const uchar *)grayImage->imageDataOrigin,grayImage->width,grayImage->height,QImage::Format_Indexed8);
pictureCamera->setPixmap(QPixmap::fromImage(showImage));
pictureCanny->setPixmap(QPixmap::fromImage(showGrayImage));
CvMemStorage * storage = cvCreateMemStorage(0);
CvSeq * contourPoints = 0; //只找外围轮廓
cvFindContours(grayImage,storage,&contourPoints,sizeof(CvContour),CV_RETR_EXTERNAL,/*CV_RETR_TREE,*/CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
cvDrawContours(pProcessImage1,contourPoints,CV_RGB(255,0,0),CV_RGB(0,255,0),1,2);
QImage showProcess1Image((const uchar *)pProcessImage1->imageDataOrigin,pProcessImage1->width,pProcessImage1->height,QImage::Format_RGB888);
pictureProcess1->setPixmap(QPixmap::fromImage(showProcess1Image));
CvSeq * pix = contourPoints;
CvSeq * contourPixs = cvCreateSeq(CV_SEQ_KIND_GENERIC|CV_32SC2,sizeof(CvContour),sizeof(CvPoint),storage);
int maxTotal = 0;
CvSeq * pMaxTotalPix = pix;
for(;pix;pix = pix->h_next)
{
if(pix ->total >maxTotal)
{
maxTotal = pix ->total;
pMaxTotalPix = pix;
/*
for(int m =0;m<pix->total;m++)
{
CvPoint x = *(CvPoint *)cvGetSeqElem(pix,m);
cvSeqPush(contourPixs,&x);
//cvCircle(pProcessImage2,x,2,CV_RGB(255,255,0));
}*/
}
}
if(maxTotal)
{
/*
for(int j=0;j<maxTotal;j++)
{
CvPoint *x =(CvPoint *)cvGetSeqElem(pMaxTotalPix,j);
cvSeqPush(contourPixs,&x);
//cvCircle(pProcessImage2,x[0],3,CV_RGB(255,255,0),-1);
}
*/
contourPixs = pMaxTotalPix;
CvSeq *hull;
hull = cvConvexHull2(contourPixs,0,CV_CLOCKWISE,0);
for(int j=0;j<hull->total;j++)
{
CvPoint *p1;
CvPoint *p2;
p1 = *CV_GET_SEQ_ELEM(CvPoint*,hull,j);
if(j == hull->total-1)
p2 = *CV_GET_SEQ_ELEM(CvPoint*,hull,0);
else
p2 = *CV_GET_SEQ_ELEM(CvPoint*,hull,j+1);
cvLine(pProcessImage2,*p1,*p2,CV_RGB(0,0,255),2);
cvCircle(pProcessImage2,p1[0],4,CV_RGB(0,255,0),-1);
}
CvSeq * defects;
defects = cvConvexityDefects(contourPixs,hull);
for(int i =0;i<defects->total;i++)
{
CvConvexityDefect defect = *(CvConvexityDefect *)cvGetSeqElem(defects,i);
cvLine(pProcessImage2,*defect.start,*defect.depth_point,CV_RGB(0,255,0),2);
cvLine(pProcessImage2,*defect.depth_point,*defect.end,CV_RGB(0,255,0),2);
cvCircle(pProcessImage2,*defect.depth_point,4,CV_RGB(255,0,255),-1);
}
}
pictureProcess2->setText(QString::number(pImage->width));
QImage showProcess2Image((const uchar *)pProcessImage2->imageDataOrigin,pProcessImage2->width,pProcessImage2->height,QImage::Format_RGB888);
pictureProcess2->setPixmap(QPixmap::fromImage(showProcess2Image));
cvReleaseMemStorage(&storage);
}
}
void MainWindow::stopVideo()
{
}
void MainWindow::paintEvent(QPaintEvent *event)
{
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
cvcamera.rar (3个子文件)
cvcamera
main.cpp 206B
mainwindow.cpp 8KB
mainwindow.h 905B
共 3 条
- 1
资源评论
- samson.song2017-12-21opencv+qt 摄像头手部检测识别
- longuby2016-05-09标题很牛,代码太简单,参考价值不大
面神君
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功