OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5277|回复: 12

根据示例代码自己改动了一段的代码 有帮忙看看对错的么? 跪求大佬帮忙

[复制链接]

5

主题

16

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-5-8
在线时间
7 小时
发表于 2020-5-9 14:17:41 | 显示全部楼层 |阅读模式
1金钱
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 主窗口初始化 */
    this->setGeometry(0, 0, 800, 480);
    this->setWindowFlags(Qt::FramelessWindowHint);
    /* QProcess通信初始化 */
    qprocessCommunicationInit();
    /* 加载图片并显示原图 */
    matData = imread("./resources/image/image.jpg");
    imgLabel = new QLabel(this);
    imgLabel->setGeometry(0, 0, 800, 480);
    originalImgShow();
    /* 顶部菜单栏部件初始化 */
    topMenuInit();
    /* 按钮初始化 */
    CV_Menu = new QWidget(this);
    CV_Menu->setGeometry(640, 50, 160, 430);
    CV_Menu->setStyleSheet("QWidget{ background-color: rgba(0, 0, 0, 80%); }");
    btnArr.clear();
    splitter = new QSplitter(CV_Menu);         // 使用分裂器垂直布局
    splitter->setOrientation(Qt::Vertical);    // 垂直布局
    splitter->setGeometry(0, 0, 160, 430);
    splitter->setHandleWidth(4);              // 间隔大小
    QPushButton *originalBtn = new QPushButton(CV_Menu);
    originalBtn->setText("原图");
    connect(originalBtn, SIGNAL(clicked()), this, SLOT(originalImgShow()));
    btnArr.append(originalBtn);
    QPushButton *cannyBtn = new QPushButton(CV_Menu);
    cannyBtn->setText("检测");
    connect(cannyBtn, SIGNAL(clicked()), this, SLOT(CV_Canny()));
    btnArr.append(cannyBtn);
    for (int i = 0; i < btnArr.count(); i++) {
        QPushButton *btn = btnArr.at(i);
        btn->setStyleSheet("QPushButton{ background-color:rgba(255, 255, 255, 30%); outline:none;"
                                       " color:rgb(100, 100, 200); }");
        splitter->addWidget(btn);
    }
    /* 固定分割线不能移动 */
    QSplitterHandle *splitterHandle = NULL;
    for (int i = 1; i <= 6; i++) {
        splitterHandle = splitter->handle(i);
        splitterHandle->setDisabled(true);
    }
}
MainWindow::~MainWindow()
{
}
void MainWindow::CV_Canny(void)
{
    Mat temp;
    cvtColor(matData, temp, COLOR_BGR2GRAY);
detect(temp);
    QImage img = QImage((const unsigned char *)(temp.data),
                        temp.cols,
                        temp.rows,
                        static_cast<int>(temp.step),
                        QImage::Format_Grayscale8);
    QPixmap pixmap = QPixmap(QPixmap::fromImage(img.rgbSwapped()));
    imgLabel->setPixmap(pixmap);
}
enum METHOD { MEAN, GAUSS, MEDIAN };
Mat adaptiveThresh(Mat I, int radius, float ratio, METHOD method = MEAN)
{
Mat smooth;
switch (method)
{
case MEAN:
  boxFilter(I, smooth, CV_32FC1, Size(2 * radius + 1, 2 * radius + 1));
  break;
case GAUSS:
  GaussianBlur(I, smooth, Size(2 * radius + 1, 2 * radius + 1), 0, 0);
  break;
case MEDIAN:
  medianBlur(I, smooth, 2 * radius + 1);
  break;
default:
  break;
}
I.convertTo(I, CV_32FC1);
smooth.convertTo(smooth, CV_32FC1);
Mat diff = I - (1.0 - ratio)*smooth;
Mat out = Mat::zeros(diff.size(), CV_8UC1);
for (int r = 0; r < out.rows; r++)
{
  for (int c = 0; c < out.cols; c++)
  {
   if (diff.at<float>(r, c) >= 0)
    out.at<uchar>(r, c) = 255;
  }
}
return out;
}
//
void detect(InputArray src)
{
Ptr<CLAHE> clahe = createCLAHE(2.0, Size(8, 8));
Mat dst1;  Mat dst2;
clahe->apply(src, dst1);//自适应直方图均衡化
dst2 = adaptiveThresh(dst1, 10, 0.15, GAUSS);//自适应阈值分割
Mat dst3;
Mat element;
element = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(dst2, dst3, MORPH_CLOSE, element, Point(-1, -1), 1);
Mat edge;
Canny(dst3, edge, 40, 150, 3, true);
Mat contoursImg = Mat::zeros(src.size(), CV_8UC3);
Mat out(src.size(), src.type());
out = Scalar::all(255);
vector<Vec3f> circles;
HoughCircles(edge, circles, CV_HOUGH_GRADIENT, 1.5, 30, 150, 38, 120, 200);
double num = 0.0;
for (size_t i = 0; i < circles.size(); i++)//把霍夫变换检测出的圆画出来
{
  Point center(cvRound(circles[0]), cvRound(circles[1]));
  double radius = cvRound(circles[2]);
  circle(out, center, 0, Scalar(0, 255, 0), -1, 8, 0);
  circle(out, center, radius, Scalar(0, 0, 255), 1, 8, 0);
  double rect = radius * radius*3.14;
   num = num + rect;
  cout << "【用轮廓面积计算函数计算出来的第" << i << "个圆的面积为:】" << rect << endl;
  
}
cout << "num:" << num << endl;
imshow("特征提取", out);
cout << circles.size() << "," << endl;
}
void MainWindow:riginalImgShow(void)
{
    QImage img = QImage((const unsigned char *)(matData.data),
                        matData.cols,
                        matData.rows,
                        static_cast<int>(matData.step),
                        QImage::Format_RGB888);
    QPixmap pixmap = QPixmap(QPixmap::fromImage(img.rgbSwapped()));
    imgLabel->setPixmap(pixmap);
}
void MainWindow::slotHomeBtnClicked()
{
    QFile f_out;
    f_out.open(stdout, QIODevice::WriteOnly);
    f_out.write("show");
    f_out.close();
    hide();
}
void MainWindow::slotQuitBtnClicked()
{
    slotHomeBtnClicked();
    qApp->quit();
}
void MainWindow::slotActivated(int fd)
{
    if(fd != qproComcation.stdIn.handle()) //
        return;
    char buffer[50];
    read(fd, buffer, 10);   // 读取消息
    if (!strcmp(buffer, "show"))    // 匹配消息并执行相应指令
        this->show();
    if (!strcmp(buffer, "quit"))
        qApp->quit();
}
void MainWindow::topMenuInit()
{
    topMenu.topMenuBar = new QWidget(this);
    topMenu.topMenuBar->setGeometry(0, 0, 800, 40);
    topMenu.topMenuBar->setStyleSheet("QWidget{ background-color:rgba(0, 0, 0, 80%); }");
    topMenu.topTitle = new QLabel(topMenu.topMenuBar);
    topMenu.topTitle->setGeometry(300, 0, 200, 40);
    topMenu.topTitle->setAlignment(Qt::AlignCenter);
    topMenu.topTitle->setStyleSheet("QLabel{ background-color:transparent; color:white;"
                                    "        font:20pt \"Microsoft YaHei\"; }");
    topMenu.topTitle->setText("OpenCV演示");
    topMenu.quitBtn = new QPushButton(topMenu.topMenuBar);
    topMenu.quitBtn->setGeometry(740, 0, 40, 40);
    topMenu.quitBtn->setStyleSheet("QPushButton{ border-image:url(:/resources/icon/quit_2.png);"
                                   "             background-color:transparent; outline: none; }"
                                   "QPushButton:pressed{ border-image:url(:/resources/icon/quit_1.png); }");
    topMenu.homeBtn = new QPushButton(topMenu.topMenuBar);
    topMenu.homeBtn->setGeometry(10, 0, 40, 40);
    topMenu.homeBtn->setStyleSheet("QPushButton{ border-image:url(:/resources/icon/home.png);"
                                   "             background-color:transparent; outline: none; }");
    connect(topMenu.quitBtn, SIGNAL(clicked()), this, SLOT(slotQuitBtnClicked()));
    connect(topMenu.homeBtn, SIGNAL(clicked()), this, SLOT(slotHomeBtnClicked()));
}
void MainWindow::qprocessCommunicationInit()
{
    qproComcation.stdIn.open(stdin, QIODevice::ReadOnly);
    qproComcation.sn = new QSocketNotifier(qproComcation.stdIn.handle(), QSocketNotifier::Read, this);
    connect(qproComcation.sn, SIGNAL(activated(int)), this, SLOT(slotActivated(int)));
}


以上是我根据正点原子里的移植opencv那个源代码改的    改动的不多  因为需要的功能也只是检测图片中的圆并输出所有检测得到的圆的面积,小白一个  只能这样试试了  请问这样改动后 可以编译并复制进板子的root目录下运行了么?   如果哪里有错 不行的话   请帮忙指出来可以么  万分感谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-8-3
在线时间
8 小时
发表于 2020-5-9 14:17:43 | 显示全部楼层
初级入门者,不懂,帮顶
回复

使用道具 举报

0

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2020-5-6
在线时间
0 小时
发表于 2020-5-9 14:17:51 | 显示全部楼层
原子哥,快来帮楼主解答吧,等不及了
回复

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-5-8
在线时间
7 小时
 楼主| 发表于 2020-5-9 15:50:41 | 显示全部楼层
我顶
回复

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-5-8
在线时间
7 小时
 楼主| 发表于 2020-5-10 23:06:39 | 显示全部楼层
别沉  快点到字数啊。。。。。
回复

使用道具 举报

0

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2552
金钱
2552
注册时间
2019-12-5
在线时间
352 小时
发表于 2020-5-11 09:35:48 | 显示全部楼层
加油,帮顶
回复

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2178
金钱
2178
注册时间
2018-8-27
在线时间
258 小时
发表于 2020-5-11 09:43:21 | 显示全部楼层
兄弟啊,行不行  你编译测试下不就完了   代码你都写出来了  你只需要编译测试就行了  你别告诉我你没有板子啊
森罗万象
回复

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-5-8
在线时间
7 小时
 楼主| 发表于 2020-5-13 10:47:55 | 显示全部楼层
xiaotaotao 发表于 2020-5-11 09:43
兄弟啊,行不行  你编译测试下不就完了   代码你都写出来了  你只需要编译测试就行了  你别告诉我你没有板 ...

我这2天已经在板子里跑了  又改动了一点地方  不过现在有个问题  就是我算出了图像中圆的面积了  不过代码里写的是cout的   这样数据是在终端出现  请问怎样才能在屏幕上显示啊?
回复

使用道具 举报

0

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2552
金钱
2552
注册时间
2019-12-5
在线时间
352 小时
发表于 2020-5-13 10:57:00 | 显示全部楼层
楼主,努力加油!!QT可以先在windows下的QtCreate调试
回复

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-5-8
在线时间
7 小时
 楼主| 发表于 2020-5-13 11:01:44 | 显示全部楼层
watsonxia 发表于 2020-5-13 10:57
楼主,努力加油!!QT可以先在windows下的QtCreate调试

谢谢  我现在已经放到板子里跑了  结果也能出来的   不过现在我最后数据是显示在终端的  有什么办法显示到屏幕去么?
回复

使用道具 举报

0

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2552
金钱
2552
注册时间
2019-12-5
在线时间
352 小时
发表于 2020-5-13 11:03:29 | 显示全部楼层
原子哥的qt V1.4 版本例程 在Windows下QTCreate可以运行的。
回复

使用道具 举报

0

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2552
金钱
2552
注册时间
2019-12-5
在线时间
352 小时
发表于 2020-5-13 11:07:50 | 显示全部楼层
菜鸟9527的弟弟 发表于 2020-5-13 11:01
谢谢  我现在已经放到板子里跑了  结果也能出来的   不过现在我最后数据是显示在终端的  有什么办法显示 ...

是不是要加一个QLabel, 然后setText.
回复

使用道具 举报

5

主题

16

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-5-8
在线时间
7 小时
 楼主| 发表于 2020-5-13 11:38:24 | 显示全部楼层
watsonxia 发表于 2020-5-13 11:07
是不是要加一个QLabel, 然后setText.

嗯  我处理过后的图片是这样显示的  用的setPixmap   我去试试加入你说的这个setText试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 12:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表