linux下的C程序内存泄露问题

发布于 2021-11-27 22:41:41 字数 31134 浏览 700 评论 5

/////////////////////////////////////////////////////////////////////////////////////////

//MainDlg.cpp

//Author: EmbedVision

/////////////////////////////////////////////////////////////////////////////////////////

#include "MainDlg.h"

#include <QDebug>

#include <stdlib.h>    //system函数头文件

#include <math.h>

#define max_feature_num 100

CMainDlg::CMainDlg(QWidget* parent) : QDialog(parent)

{

//设置对话框的标题、位置与大小

this->setWindowTitle(QString::fromUtf8("高效率的绳轮升降器滑轮检测软件"));

this->setGeometry(0, 40, 800, 440);

// startInit();

    myCom = NULL;

//创建按钮对象

m_startBtn = new QPushButton(QString::fromUtf8("开始采集"), this);

m_stopBtn = new QPushButton(QString::fromUtf8("停止采集"), this);

m_snapBtn = new QPushButton(QString::fromUtf8("抓拍模板"), this);

m_deleteBtn = new QPushButton(QString::fromUtf8("删除模板"), this);

m_matchBtn = new QPushButton(QString::fromUtf8("匹配模式"), this);

m_cejuBtn = new QPushButton(QString::fromUtf8("测距模式"), this);

m_cancelBtn = new QPushButton(QString::fromUtf8("退出程序"), this);

//设置按钮对象的位置

m_startBtn->setGeometry(35, 320, 100, 40);

m_stopBtn->setGeometry(140, 320, 100, 40);

m_snapBtn->setGeometry(245, 320, 100, 40);

m_deleteBtn->setGeometry(350, 320, 100, 40);

m_matchBtn->setGeometry(455, 320, 100, 40);

m_cejuBtn->setGeometry(560, 320, 100, 40);

m_cancelBtn->setGeometry(665, 320, 100, 40);

//设置按钮对象的样式及状态

m_startBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

m_stopBtn->setEnabled(false);

m_stopBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_snapBtn->setEnabled(false);

m_snapBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_deleteBtn->setEnabled(false);

m_deleteBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_matchBtn->setEnabled(false);

m_matchBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_cejuBtn->setEnabled(false);

m_cejuBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

    m_cancelBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

//关联信号与槽

connect(m_startBtn, SIGNAL(clicked()), this, SLOT(startBtn()));

connect(m_stopBtn, SIGNAL(clicked()), this, SLOT(stopBtn()));

connect(m_snapBtn, SIGNAL(clicked()), this, SLOT(snapBtn()));

connect(m_deleteBtn, SIGNAL(clicked()), this, SLOT(deleteBtn()));

connect(m_matchBtn, SIGNAL(clicked()), this, SLOT(matchBtn()));

connect(m_cejuBtn, SIGNAL(clicked()), this, SLOT(cejuBtn()));

connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(reject()));

//设置图像的大小

m_image = QImage(IMAGE_WIDTH, IMAGE_HEIGHT, QImage::Format_RGB888);

//创建定时器

m_timer = new QTimer(this);

connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimer()));

m_img_8u1_gray = new unsigned char[IMAGE_WIDTH*IMAGE_HEIGHT];

m_img_8u1_merge = new unsigned char[IMAGE_WIDTH*IMAGE_HEIGHT];

m_srcImg = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

m_gaussionImg = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

m_cannyEdgeImg = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

m_cannyEdgeImg1 = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

edge = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

edge1 = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

img = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

temp = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

img1 = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

temp1 = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U,1);

m_eig_image =cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT),IPL_DEPTH_32F ,1);

m_temp_image=cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT),IPL_DEPTH_32F ,1);

m_camera.snap_mode=0;

//初始化摄像头参数

memset(&m_camera, 0, sizeof(V4L2_data));

m_camera.dev_name = (char*)("/dev/video2");

b = 0;

}

CMainDlg::~CMainDlg()

{

delete []m_img_8u1_gray;

m_img_8u1_gray = NULL;

delete []m_img_8u1_merge;

m_img_8u1_merge = NULL;

cvReleaseImage(&m_srcImg);

cvReleaseImage(&m_gaussionImg);

cvReleaseImage(&img);

cvReleaseImage(&m_cannyEdgeImg);

cvReleaseImage(&m_cannyEdgeImg1);

cvReleaseImage(&edge);

cvReleaseImage(&edge1);

cvReleaseImage(&img1);

cvReleaseImage(&temp);

cvReleaseImage(&temp1);

cvReleaseImage(&m_eig_image);

cvReleaseImage(&m_temp_image);

if(myCom != NULL){

        if(myCom->isOpen()){

            myCom->close();

        }

        delete myCom;

    }

}

void CMainDlg::paintEvent(QPaintEvent *event)

{

    float u=0.15187333;          //放大倍数

//显示图像及叠加的信息

QPainter painter(this);

m_pixmap = QPixmap::fromImage(m_image.scaled(400, 300,  Qt::KeepAspectRatio));

painter.drawPixmap(0, 0, m_pixmap);

if(m_camera.snap_mode == 0)

{

QPainter painter4(this);

painter4.setPen(QPen(QColor(255,0,0), 12, Qt::SolidLine, Qt::RoundCap));

painter4.setFont(QFont("wenquanyi", 16));

painter4.drawText(590, 155, QString::fromUtf8("请抓拍模板"));

}

//显示抓拍的模板图像

if(m_camera.snap_mode == 1)

{

QPainter painter1(this);

img_8u3_rgb888.load("../need2_gray.bmp");

n_pixmap = QPixmap::fromImage(img_8u3_rgb888.scaled(400, 300,  Qt::KeepAspectRatio));

painter1.drawPixmap(400, 0, n_pixmap);

QPainter painter2(this);

painter2.setPen(QPen(QColor(255,0,0), 12, Qt::SolidLine, Qt::RoundCap));

painter2.setFont(QFont("wenquanyi", 10));

painter2.drawText(410, 287, QString::fromUtf8("模板图像"));

edge=QImageToIplImage(&img_8u3_rgb888);

cvThresholdOtsu(edge, edge1);

CvSeq* contours2=NULL;

CvMemStorage*    mem2 = cvCreateMemStorage(0);

count=cvFindContours(m_cannyEdgeImg1,mem2,&contours2,sizeof(CvContour),CV_RETR_EXTERNAL);

int aa[1024];

int j=0;  

    for (CvSeq* c = contours2; c != NULL; c = c->h_next) 

{  

// if(j<=20) 

// {

// QString tlength = QString::number(j, 10);

// QMessageBox* box1 = new QMessageBox;

    // QTimer::singleShot(200, box1, SLOT(close()));

// box1->setWindowTitle(tr("返回结果"));

    // box1->setIcon(QMessageBox::Warning);

    // box1->setText(tlength);

// box1->show();

// } 

         CvRect rc =cvBoundingRect(c,0);  

if(rc.width<108||rc.height<108)

{

continue;

}

 rc.x=rc.x-2;

  rc.y=rc.y-2;

  rc.width=rc.width+4;

  rc.height=rc.height+4;//重新稍微扩大矩形框

       

QPainter painter7(this);

painter7.setPen(QPen(QColor(255,0,0), 1, Qt::SolidLine, Qt::RoundCap));

     painter7.drawRect(cvRound(rc.x*300/480),cvRound(rc.y*300/480),cvRound(rc.width*300/480),cvRound(rc.height*300/480));

aa[j]=rc.x;

    IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 1);   

    cvSetImageROI(m_cannyEdgeImg1, rc);  

    cvCopyImage(m_cannyEdgeImg1, imgNo); 

CvSeq*    contours1=NULL;

CvSeq*    contours3=NULL;

CvMemStorage*  mem1 = cvCreateMemStorage();

CvMemStorage*   mem3= cvCreateMemStorage();

cvFindContours(edge1,mem1,&contours1,sizeof(CvContour),CV_RETR_EXTERNAL);

cvFindContours(imgNo,mem3,&contours3,sizeof(CvContour),CV_RETR_EXTERNAL);

bb[j]= cvMatchShapes(contours1,contours3,3);

j++;

    cvResetImageROI(m_cannyEdgeImg1);  

     cvReleaseImage(&imgNo);

cvReleaseMemStorage(&mem1);

cvReleaseMemStorage(&mem3);

   }

   cvReleaseMemStorage(&mem2);

              

    

     

 for(int k=1;k<j;k++)

          for(int m=0;m<j-k;m++)

          {

              if (aa[m]>aa[m+1])

              {

 int t;

 double x;

              t=aa[m];

     x=bb[m];

              aa[m]=aa[m+1];

 bb[m]=bb[m+1];

              aa[m+1]=t;

 bb[m+1]=x;

              }

          }

if(j!=0)

{

 char text[1024];

 sprintf(text, "轮廓数%d", j);

 QPainter painter3(this);

 painter3.setPen(QPen(QColor(255,0,0), 12, Qt::SolidLine, Qt::RoundCap));

 painter3.setFont(QFont("wenquanyi", 12));

 painter3.drawText(10, 400, QString::fromUtf8(text));

}

if(bb[0]!=0)

 {

 double zhi=bb[0];

 char text1[1024];

 sprintf(text1, "匹配值%.9f", zhi);

 QPainter painter8(this);

 painter8.setPen(QPen(QColor(255,0,0), 12, Qt::SolidLine, Qt::RoundCap));

 painter8.setFont(QFont("wenquanyi", 12));

 painter8.drawText(100, 400, QString::fromUtf8(text1));

 }

 if(bb[1]!=0)

 {

 double zhi1=bb[1];

 char text2[1024];

 sprintf(text2, "匹配值%.9f", zhi1);

 QPainter painter9(this);

 painter9.setPen(QPen(QColor(255,0,0), 12, Qt::SolidLine, Qt::RoundCap));

 painter9.setFont(QFont("wenquanyi", 12));

 painter9.drawText(310, 400, QString::fromUtf8(text2));

 }

//QString text  = QString("%1  %2  %3").arg(count).arg(zhi, 0,'g',8).arg(zhi1, 0,'g',8);

//QMessageBox* box1 = new QMessageBox;

   // QTimer::singleShot(1000, box1, SLOT(close()));

   // box1->setWindowTitle(tr("警告"));

   // box1->setIcon(QMessageBox::Warning);

   // box1->setText(text);

   // box1->show();

/*char text[1024];

sprintf(text, "匹配值%.9f", match);

QPainter painter3(this);

painter3.setPen(QPen(QColor(255,0,0), 12, Qt::SolidLine, Qt::RoundCap));

painter3.setFont(QFont("wenquanyi", 16));

painter3.drawText(10, 400, QString::fromUtf8(text));

storage=cvCreateMemStorage(0);

results=cvHoughCircles(m_cannyEdgeImg1,storage,CV_HOUGH_GRADIENT,2,m_cannyEdgeImg1->width/7,the,60,102,120);//测外径

for( i=0;i<results->total ;i++)

     {

           float* p=(float*) cvGetSeqElem(results,i);

           CvPoint pt=cvPoint(cvRound(p[0]*300/480),cvRound(p[1]*300/480));//圆心坐标

           int a=cvRound(p[0]*300/480)-cvRound(p[2]*300/480);

  int b=cvRound(p[1]*300/480)-cvRound(p[2]*300/480);

  int c=2*cvRound(p[2]*300/480);

  QPainter painter5(this);

  painter5.setPen(QPen(QColor(255,0,0), 1, Qt::SolidLine, Qt::RoundCap));

  painter5.drawEllipse(a,b,c,c);

           //cvCircle(image,pt,cvRound(p[2]),CV_RGB(0xff,0xff,0xff));//半径长度

     }

if(results!=NULL)

{

float* m=(float*) cvGetSeqElem(results,0);

char text_buf0[1024];

if(m!=NULL)

{

   sprintf(text_buf0, "R0:%.9f mm", cvRound(m[2])*u);

r0=cvRound(m[2])*u;

    }

QPainter painter6(this);

painter6.setPen(QPen(QColor(255,0,0), 6, Qt::SolidLine, Qt::RoundCap));

painter6.setFont(QFont("wenquanyi", 8));

painter6.drawText(400, 50, QString::fromUtf8(text_buf0));

}*/

}

QWidget::paintEvent(event);

}

void CMainDlg::moveEvent(QMoveEvent* event)

{

//保持窗口在触摸屏中的位置不变

this->setGeometry(0, 40, 800, 440);

QDialog::moveEvent(event);

}

void CMainDlg::startBtn()

{

//初始化摄像头

int error_code = init_dev(&m_camera);

  if(error_code < 0 )

{

//显示错误信息

char error_buf[1024];

sprintf(error_buf, "open camera failed. error code:%d", error_code);

QMessageBox::information(this, "cann't open camera!", QString(error_buf));

return;

}

//开启定时器,启动采集

m_timer->start(80);

on_actionOpen_triggered();//打开串口

//重新设置按钮对象的样式及状态

m_startBtn->setEnabled(false);

m_startBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_stopBtn->setEnabled(true);

m_stopBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

m_snapBtn->setEnabled(true);

m_snapBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

m_deleteBtn->setEnabled(false);

m_deleteBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_matchBtn->setEnabled(false);

m_matchBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_cejuBtn->setEnabled(false);

m_cejuBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_cancelBtn->setEnabled(false);

m_cancelBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

}

void CMainDlg::stopBtn()

{

//关闭定时器,停止采集

m_timer->stop();

//停止摄像头

stop_dev(&m_camera);

    on_actionClose_triggered();//关闭串口  

//重新设置按钮对象的样式及状态

m_startBtn->setEnabled(true);

m_startBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

m_stopBtn->setEnabled(false);

m_stopBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_snapBtn->setEnabled(false);

m_snapBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_deleteBtn->setEnabled(false);

m_deleteBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_matchBtn->setEnabled(false);

m_matchBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_cejuBtn->setEnabled(false);

m_cejuBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_cancelBtn->setEnabled(true);

m_cancelBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

    

}

void CMainDlg::snapBtn()

{

char file_name[1024];

sprintf(file_name, "need2_gray.bmp");

qsBmpGraySave((unsigned char*)(m_cannyEdgeImg1->imageData), IMAGE_WIDTH, IMAGE_HEIGHT, file_name, 1);

m_snapBtn->setEnabled(false);

m_snapBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_stopBtn->setEnabled(false);

m_stopBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_deleteBtn->setEnabled(true);

m_deleteBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

m_matchBtn->setEnabled(true);

m_matchBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

m_cejuBtn->setEnabled(true);

m_cejuBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

startInit();//打开定时器开始发数据

}

void CMainDlg::deleteBtn()

{

system("rm -rf need2_gray.bmp");   //删除抓拍到的模板图像

on_timeClose_triggered();//关闭定时器停止发数据

m_camera.snap_mode = 0;

m_snapBtn->setEnabled(true);

m_snapBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

m_deleteBtn->setEnabled(false);

m_deleteBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_stopBtn->setEnabled(true);

m_stopBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(55,100,255); background-color:rgb(155,200,33); border-radius:8px}");

m_matchBtn->setEnabled(false);

m_matchBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

m_cejuBtn->setEnabled(false);

m_cejuBtn->setStyleSheet("QPushButton{font-size:24px; color:rgb(50,50,50); background-color:rgb(155,155,155); border-radius:8px}");

}

void CMainDlg::matchBtn()

{

m_camera.snap_mode = 1;

}

void CMainDlg::cejuBtn()

{

m_camera.snap_mode = 2;

}

void CMainDlg::onTimer()

{

//统计算法耗时

struct  timeval tpstart, tpend;

float timeuse;

gettimeofday(&tpstart, NULL);

//获取当前帧图像

if(1 != read_frame(&m_camera, NULL, m_img_8u1_gray) )

return;

memcpy(m_srcImg->imageData, m_img_8u1_gray, IMAGE_WIDTH*IMAGE_HEIGHT);//图像拷贝

//高斯平滑

cvSmooth(

m_srcImg,       //输入图像

m_gaussionImg,  //输出图像

CV_GAUSSIAN,    //高斯卷积

7, 7,           //卷积参数7x7

1.0, 1.0);      //参数标准差

//自适应阈值分割 自定义函数

the=cvThresholdOtsu(m_srcImg, m_cannyEdgeImg);

    //开运算

    cvMorphologyEx(m_cannyEdgeImg,img,temp,NULL, CV_MOP_OPEN,1);

//闭运算

cvMorphologyEx(img,img1,temp1,NULL,CV_MOP_CLOSE,1);

//Canny边缘检测

cvCanny(

img1,

m_cannyEdgeImg1,

50, the);

//得到组合的显示图像

/*qsMerge4Image(

m_img_8u1_gray, 

(unsigned char*)(m_gaussionImg->imageData),  

(unsigned char*)(img1->imageData), 

(unsigned char*)(m_cannyEdgeImg1->imageData), 

IMAGE_WIDTH, IMAGE_HEIGHT, 

m_img_8u1_merge);*/

qsGray2Rgb((unsigned char*)(m_cannyEdgeImg1->imageData), IMAGE_WIDTH, IMAGE_HEIGHT, m_image.bits());

gettimeofday(&tpend, NULL);

timeuse = 1000*(tpend.tv_sec - tpstart.tv_sec) + (tpend.tv_usec - tpstart.tv_usec)/1000.0;    //单位ms

//显示图像帧号及耗时信息

char text_buf[1024];

sprintf(text_buf, "第%d帧; 所有处理共耗时%.2f ms", m_camera.frame_index, timeuse);

QPainter painter(&m_image);

painter.setPen(QPen(QColor(255,0,0), 12, Qt::SolidLine, Qt::RoundCap));

painter.setFont(QFont("wenquanyi", 16));

painter.drawText(10, 40, QString::fromUtf8(text_buf));

painter.drawText(10, 460, QString::fromUtf8("实时处理图像"));

//通知paintEvent绘制图像

update();

}

int CMainDlg::cvThresholdOtsu(IplImage* src, IplImage* dst)

{

int height=src->height;

int width=src->width;

//histogram计算直方图并归一化

float histogram[256]={0};

for(int i=0;i<height;i++) {

unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;

for(int j=0;j<width;j++) {

histogram[*p++]++;

}

}

//normalize histogram

int size=height*width;

for(int i=0;i<256;i++) {

histogram[i]=histogram[i]/size;

}

//average pixel value计算图像灰度均值

float avgValue=0;

for(int i=0;i<256;i++) {

avgValue+=i*histogram[i];

}

int threshold;

float maxVariance=0;

float w=0,u=0;

for(int i=0;i<256;i++) {

w+=histogram[i];

u+=i*histogram[i];

float t=avgValue*w-u;

float variance=t*t/(w*(1-w));

if(variance>maxVariance) {

maxVariance=variance;

threshold=i;

}

}

cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);

return threshold;

}

IplImage *CMainDlg::QImageToIplImage(const QImage * qImage)

{

    int width = qImage->width();

    int height = qImage->height();

    CvSize Size;

    Size.height = height;

    Size.width = width;

    IplImage *IplImageBuffer = cvCreateImage(Size, IPL_DEPTH_8U, 1);

    for (int y = 0; y < height; ++y)

    {

        for (int x = 0; x < width; ++x)

        {

            QRgb rgb = qImage->pixel(x, y);

            cvSet2D(IplImageBuffer, y, x, CV_RGB(qRed(rgb), qGreen(rgb), qBlue(rgb)));

        }

    }

    return IplImageBuffer;

}

void CMainDlg::startInit()

{

    //初始化连续发送计时器计时间隔

    obotimerdly = OBO_TIMER_INTERVAL;

    //设置连续发送计时器

    obotimer = new QTimer(this);

obotimer->start(obotimerdly);

    connect(obotimer, SIGNAL(timeout()), this, SLOT(sendMsg()));

}

//打开串口

void CMainDlg::on_actionOpen_triggered()

{

    QString portName = "ttyUSB0";   //获取串口名

#ifdef Q_OS_LINUX

    myCom = new QextSerialPort("/dev/" + portName);

#elif defined (Q_OS_WIN)

    myCom = new QextSerialPort(portName);

#endif

    connect(myCom, SIGNAL(readyRead()), this, SLOT(readMyCom()));

    //设置波特率

    myCom->setBaudRate(BAUD9600);//波特率9600

    //设置数据位

    myCom->setDataBits(DATA_8);//8位数据位

    //设置校验

    myCom->setParity(PAR_NONE);//无奇偶校验

        

    //设置停止位

    myCom->setStopBits(STOP_1);//1位停止位

       

    //设置数据流控制

    myCom->setFlowControl(FLOW_OFF);//无数据流控制

    //设置延时

    myCom->setTimeout(TIME_OUT);

    if(myCom->open(QIODevice::ReadWrite))

{

        QMessageBox::information(this, tr("打开成功"), tr("已成功打开串口") + portName, QMessageBox::Ok);

    }

else

{

        QMessageBox::critical(this, tr("打开失败"), tr("未能打开串口 ") + portName + tr("n该串口设备不存在或已被占用"), QMessageBox::Ok);

        return;

    }

}

//关闭串口

void CMainDlg::on_actionClose_triggered()

{

    myCom->close();

    delete myCom;

    myCom = NULL;

}

//关闭发送数据定时器

void CMainDlg::on_timeClose_triggered()

{

    obotimer->stop(); 

delete obotimer;

obotimer = NULL;

}

//读取数据

void CMainDlg::readMyCom()

{

    QByteArray temp = myCom->readAll();

    // QString buf;

// const char *str1 = "00FF0001";

// const char *str2 = "00FF0002";

// char *dst = temp.data();

// QString tlength = QString::number(temp.length(), 10);

// QString dlength = QString::number(strlen(dst), 10);

//char txt[1024];

    // if(!temp.isEmpty()){

           // buf = temp;

 // QMessageBox::information(this, tr("读取成功"), tr("读取结果") + buf, QMessageBox::Ok);

 // sprintf(txt, temp);

 // QPainter painter10(this);

//painter10.setPen(QPen(QColor(255,0,0), 12, Qt::SolidLine, Qt::RoundCap));

//painter10.setFont(QFont("wenquanyi", 12));

//painter10.drawText(350, 400, QString::fromUtf8(txt));

    // }

// QMessageBox::information(this, tr("读取成功"), tr("读取结果") + tlength + ' ' + dlength, QMessageBox::Ok);

//QMessageBox::information(this, tr("读取成功"), tr("读取结果") + tempf.at(tempf.length() - 1), QMessageBox::Ok);

char*buffed;

    buffed=temp.data();

int i;

for(i=0;i<8;i++)

    {

        if(buffed[i]=='1')

        {

    m_camera.snap_mode = 1;

         break;//查找到第一个立即退出循环

        }

       else if(buffed[i]=='2')

        {

    m_camera.snap_mode = 2;

         break;//查找到第一个立即退出循环

        }

        else if(buffed[i]=='3')

        {

    m_camera.snap_mode = 3;

         break;//查找到第一个立即退出循环

        }

else if(buffed[i]=='4')

        {

    m_camera.snap_mode = 4;

         break;//查找到第一个立即退出循环

        }

    }

if(i==8)

{

//QMessageBox::information(this, tr("读取成功"), tr("读取结果") + temp, QMessageBox::Ok);

QMessageBox* box = new QMessageBox;

    QTimer::singleShot(500, box, SLOT(close()));

box->setWindowTitle(tr("返回结果"));

    box->setIcon(QMessageBox::Warning);

    box->setText(tr(temp));

box->show();

}

}

//发送数据

void CMainDlg::sendMsg()

{

    QByteArray buf;

QByteArray buf1;

QByteArray buf2;

QString str;

QString str1;

QString str2;

    bool ok;

    str = "05 30 30 46 46 57 52 30 44 30 30 30 30 30 31";//读D0的一点数据

buf=changetype(str);

sleep(30);

    myCom->write(buf);

// if(match!=0&&r0!=0)

// {

// int d=int(match*10000);

// int e=int(r0*100);  

// QString s4,s5;

// s4=jinzhizhuanhuan(d);

// s5=jinzhizhuanhuan(e);

// str2="05 30 30 46 46 57 57 30 44 30 30 30 34 30 32"+s4+s5;

// buf2=changetype(str2);

// sleep(30);

// myCom->write(buf2);

// }

}

//对写入数据进行进制转换

QString CMainDlg::jinzhizhuanhuan(int mn)

{

    char buffer[33];

    char*buffed;

    sprintf(buffer, "%x", mn);

    /*int length = 0;

    char *tmp = buffer;

    while(*tmp != '') {

        ++length;

        ++tmp;

    }*/

   QString str=buffer;

   if(str.length() < 4)

   {

   for(int i=-1;i<4-str.length();i++)

   {

   str="0" + str;

   }

   }

   QByteArray ba = str.toLatin1();

   buffed=ba.data();

   int  tmp;

   QString pq,lmn,jkl;

   for(int i=0;i<4;i++)

   {

   if((buffed[i]>='0')&&(buffed[i]<='9'))

   {

   tmp = buffed[i]-'0'+30;

   }

   else if((buffed[i]>='A')&&(buffed[i]<='F'))

   {

   tmp = buffed[i]-'A'+41;

   }

   else if((buffed[i]>='a')&&(buffed[i]<='f'))

   {

   tmp = buffed[i]-'a'+61;

   }

   jkl=QString::number(tmp);

   lmn=" "+jkl;

   pq+=lmn;

   }

   return pq;

}

//把字符串转换成可写类型

QByteArray CMainDlg::changetype(QString str)

{

    QByteArray buf;

    char data;

    QStringList list;

bool ok;

    list = str.split(" ");

    for(int i = 0; i < list.count(); i++)

{

    if(list.at(i) == " ")

                continue;

    if(list.at(i).isEmpty())

                continue;

    data = (char)list.at(i).toInt(&ok, 16);

            buf.append(data);

    }

    return   buf;

}

//延时函数

void CMainDlg::sleep(unsigned int msec)

{

    QEventLoop eventloop;

    QTimer::singleShot(msec, &eventloop, SLOT(quit()));

    eventloop.exec();

}

代码附上,查找了好久,没有找到内存泄露的原因。各位大神  看你们的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

月亮是我掰弯的 2021-12-04 15:31:53

这代码也太长了 、、、
http://www.zuimoban.com/php/

屌丝范 2021-12-04 15:26:42

这代码也是没谁了,内存泄漏难道 qt检查不出来?断点总会吧

滥情空心 2021-12-04 02:09:35

好像和Linux没什么关系

顾忌 2021-12-02 19:02:39

回复
你的标题不是说linux下么?我都没留心看你代码,如果是VS下的有其他办法检查,百度一下有很多方法的。比如这个:http://blog.csdn.net/windows_nt/article/details/8652191

辞别 2021-11-29 08:46:07

最关键这是哪门子 "c"啊。。。。哈。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文