opencv test code-1

#include "mainwidget.h"
#include <QDebug>
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    this->m_vLayout=new QVBoxLayout;
    this->m_hLayout=new QHBoxLayout;
    this->m_btnRGB=new QToolButton;
    this->m_btnRGB->setText(tr("RGB"));
    connect(this->m_btnRGB,SIGNAL(clicked()),this,SLOT(ZSlot2RGB()));

    this->m_btnGray=new QToolButton;
    this->m_btnGray->setText(tr("Gray"));
    connect(this->m_btnGray,SIGNAL(clicked()),this,SLOT(ZSlot2Gray()));

    this->m_btnFindCircle=new QToolButton;
    this->m_btnFindCircle->setText(tr("Recognize"));
    connect(this->m_btnFindCircle,SIGNAL(clicked()),this,SLOT(ZSlotFindCircle()));

    this->m_hLayout->addWidget(this->m_btnRGB);
    this->m_hLayout->addWidget(this->m_btnGray);
    this->m_hLayout->addWidget(this->m_btnFindCircle);
    this->m_vLayout->addStretch(1);
    this->m_vLayout->addLayout(this->m_hLayout);
    this->setLayout(this->m_vLayout);

    this->m_srcImg=cvLoadImage("/home/shell.albert/opencvtest/2.png");
    if(this->m_srcImg)
    {
        //cvCvtColor(this->m_srcImg,this->m_srcImg,CV_BGR2RGB);
        this->resize(this->m_srcImg->width+20,this->m_srcImg->height+20);
        this->m_dstImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
    }
    this->m_imgAction=IMG_SHOW_RGB;
}

MainWidget::~MainWidget()
{
    delete this->m_btnGray;
    delete this->m_btnRGB;
    delete this->m_btnFindCircle;
    delete this->m_hLayout;
    delete this->m_vLayout;
    if(this->m_srcImg)
    {
        cvReleaseImage(&this->m_srcImg);
    }
    if(this->m_dstImg)
    {
        cvReleaseImage(&this->m_dstImg);
    }
}
void MainWidget::paintEvent(QPaintEvent *event)
{
    QPainter tPainter(this);
    switch(this->m_imgAction)
    {
    case IMG_SHOW_RGB:
    {
        cvCvtColor(this->m_srcImg,this->m_srcImg,CV_BGR2RGB);
        uchar *imgData=(uchar*)this->m_srcImg->imageData;
        QImage tImage(imgData,this->m_srcImg->width,this->m_srcImg->height,this->m_srcImg->widthStep,QImage::Format_RGB888);
        tPainter.drawImage(10,10,tImage);
        cvCvtColor(this->m_srcImg,this->m_srcImg,CV_RGB2BGR);
    }
        break;
    case IMG_SHOW_GRAY:
    {
#if 0
        cvCvtColor(this->m_srcImg,this->m_dstImg,CV_BGR2GRAY);
        uchar *imgData=(uchar*)this->m_dstImg->imageData;
        QImage tImage(imgData,this->m_dstImg->width,this->m_dstImg->height,this->m_dstImg->widthStep,QImage::Format_Indexed8);
        QVector<QRgb> colorTable;
        for(qint32 i=0;i<256;i++)
        {
            colorTable.append(qRgb(i,i,i));
        }
        tImage.setColorTable(colorTable);
        tImage.setColorCount(255);
        tPainter.drawImage(10,10,tImage);
#endif
        IplImage *tDstImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
        IplImage *tImg=cvCreateImage(cvGetSize(this->m_srcImg),IPL_DEPTH_8U,1);
        cvCvtColor(this->m_srcImg,tDstImg,CV_BGR2GRAY);
        cvCanny(tDstImg,tImg,50,150,3);
        uchar *imgData=(uchar*)tImg->imageData;
        QImage tImage(imgData,tImg->width,tImg->height,tImg->widthStep,QImage::Format_Indexed8);
        QVector<QRgb> colorTable;
        for(qint32 i=0;i<256;i++)
        {
            colorTable.append(qRgb(i,i,i));
        }
        tImage.setColorTable(colorTable);
        tImage.setColorCount(255);
        tPainter.drawImage(10,10,tImage);
        cvReleaseImage(&tDstImg);
        cvReleaseImage(&tImg);
    }
        break;
    case IMG_FIND_CIRCLE:
    {
        //step 1:BGR to Gray.
        cvCvtColor(this->m_srcImg,this->m_dstImg,CV_BGR2GRAY);

        CvMemStorage *storage=cvCreateMemStorage(0);
        //cvSmooth(dstImg,dstImg,CV_GAUSSIAN,5,5);

        CvSeq *circles=cvHoughCircles(this->m_dstImg,storage,CV_HOUGH_GRADIENT,2,this->m_dstImg->width/3,300,100,0,200);
        IplImage *color=cvCreateImage(cvGetSize(this->m_dstImg),IPL_DEPTH_8U,3);
        cvCvtColor(this->m_dstImg,color,CV_GRAY2RGB);
        printf("circle total=%d\n",circles->total);
        for(int i=0;i<circles->total;i++)
        {
            float *p=(float*)cvGetSeqElem(circles,i);
            float tX=p[0];
            float tY=p[1];
            float tRadius=p[2];
            //the destination is on the right side
            //so here we ignore the left.
            if(tX<this->m_srcImg->width/2)
            {
                qDebug()<<"bypass left side";
                continue;
            }
            //draw a circle to wrap it.
            CvPoint pt=cvPoint(cvRound(p[0]),cvRound(p[1]));
            cvCircle(color,pt,cvRound(p[2]),CV_RGB(255,0,0),3,8,0);
            //draw a 10x10 rectangle aroud circle center.
            CvPoint pt1=pt;
            CvPoint pt2=pt;
            pt1.x-=5;
            pt1.y-=5;
            pt2.x+=5;
            pt2.y+=5;
            cvRectangle(color,pt1,pt2,cvScalar(255,0,0,0),3);

            //draw text.
            CvPoint txtPt=pt;
            txtPt.y-=40;
            txtPt.x-=60;
            const char *txtInfo="fint it!";
            CvFont tFont=cvFont(3.0,3);
            cvPutText(color,txtInfo,txtPt,&tFont,cvScalar(255,255,0));
        }
        //step3.display it.
        uchar *imgData=(uchar*)color->imageData;
        QImage tImage(imgData,color->width,color->height,color->widthStep,QImage::Format_RGB888);
        tPainter.drawImage(10,10,tImage);
        cvReleaseImage(&color);
    }
        break;
    default:
        break;
    }
}
void MainWidget::ZSlot2RGB()
{
    this->m_imgAction=IMG_SHOW_RGB;
    this->update();
}
void MainWidget::ZSlot2Gray()
{
    this->m_imgAction=IMG_SHOW_GRAY;
    this->update();
}
void MainWidget::ZSlotFindCircle()
{
    this->m_imgAction=IMG_FIND_CIRCLE;
    this->update();
}

### 使用 CMake-GUI 配置和构建 OpenCV 项目 #### 准备工作 为了确保顺利配置和构建 OpenCV,需提前完成必要的准备工作。这包括安装所需的依赖项以及获取最新的 OpenCV 源码。 对于 Linux 用户而言,建议预先安装 `libgtk2.0-dev` 和 `pkg-config` 工具,因为缺少这些库可能会导致后续编译过程中出现问题[^2]。可以通过如下命令进行安装: ```bash sudo apt-get update && sudo apt-get install -y libgtk2.0-dev pkg-config ``` 接着,下载并解压 OpenCV 及其额外模块 (contrib) 的源代码。可以从官方 GitHub 仓库克隆最新版本的代码: ```bash git clone https://github.com/opencv/opencv.git cd opencv mkdir build cd .. git clone https://github.com/opencv/opencv_contrib.git ``` #### 启动 CMake GUI 并设置路径 启动 CMake GUI 应用程序后,在界面上指定两个重要位置:“Where is the source code”指向 OpenCV 主目录,“Where to build the binaries”则应指向之前创建用于存放编译输出文件夹的位置(如上述例子中的 `build` 文件夹)。点击 “Configure”,选择合适的生成器(例如 Unix Makefiles 或者 Ninja),之后再次点击 “Generate”。 #### 设置选项与参数 在配置完成后,会弹出一系列可选配置项供调整优化。这里有几个重要的开关值得特别注意: - **WITH_CUDA**: 如果计划利用 GPU 加速,则需要启用此功能; - **OPENCV_EXTRA_MODULES_PATH**: 将该变量设为 contrib/modules 路径以便集成更多特性支持; - **BUILD_EXAMPLES/BUILD_TESTS/DOWNLOAD_EXTERNAL_TEST_DATA**: 这些都是辅助性质的功能,默认关闭即可减少不必要的麻烦; 当所有必要选项都已确认无误时,可以继续点击下方按钮依次执行 “Configure -> Generate”。此时会在目标文件夹下自动生成相应的 makefile 或解决方案(.sln),具体取决于所选用的生成工具。 #### 开始编译过程 最后一步就是实际编译了。如果选择了基于命令行的方式,则可以在终端进入刚才提到的目标文件夹并通过简单的指令来触发整个流程: ```bash make -j$(nproc) ``` 或者是在 Windows 上使用 Visual Studio 来加载 .sln 解决方案文件来进行编译操作[^3]。 #### 完成安装 一旦编译顺利完成,就可以通过下面这条简单命令完成最终的安装步骤: ```bash sudo make install ``` 这样就完成了使用 CMake-GUI 对 OpenCV 的完整配置与构建过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值