opencv复现Halcon太阳能硅片缺陷检测例程

文章目录

效果

OK的:
在这里插入图片描述

NG的:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码

   #define show(image)          cv::namedWindow(#image,cv::WINDOW_NORMAL);\
                            cv::imshow(#image, image)
     int i = 1;
    while(1)
    {
        cv::Mat src;
        QString  dir("D:\\QtProject\\Opencv_Example\\solar_cell\\solar_cell_");
        QString path;
        if(i>9)
            path = QString("%1%2%3").arg(dir).arg(i++).arg(".png");
        else
            path = QString("%1%2%3%4").arg(dir).arg("0").arg(i++).arg(".png");

        cout<<path.toStdString()<<endl;

        src = cv::imread(path.toStdString(), cv::IMREAD_COLOR);
        if (src.empty()) {
            cout << "Cannot load image" << endl;
            return;
        }
        show(src);
        cout<<__func__<<src.channels();

        cv::Mat rgbImages[3];
        cv::split(src,rgbImages);
//        cv::imshow("r",rgbImages[0]);
//        cv::imshow("g",rgbImages[1]);
        show(rgbImages[2]);

        cv::Mat bImageNot;

        cv::bitwise_not(rgbImages[2], bImageNot);
        show(bImageNot);

        cv::Mat ImageBinary;
        cv::threshold(bImageNot, ImageBinary, 159, 255, cv::THRESH_BINARY);
        show(ImageBinary);

        std::vector<std::vector<cv::Point> > contoursDefect;
        std::vector<cv::Vec4i> hierarchyDefect;
        cv::Mat regionOut = cv::Mat::zeros(ImageBinary.size(), ImageBinary.type());
        cv::Mat regionIn = cv::Mat::zeros(ImageBinary.size(), ImageBinary.type());

        cv::Mat goodSmallRegion = cv::Mat::zeros(ImageBinary.size(), ImageBinary.type());
        cv::Mat goodLongRegion = cv::Mat::zeros(ImageBinary.size(), ImageBinary.type());

        //cv::cvtColor(ImageBinary, canves,cv::COLOR_RGBA2RGB);
        cv::findContours(ImageBinary, contoursDefect, hierarchyDefect, cv::RETR_TREE, cv::CHAIN_APPROX_NONE);
        for (size_t i = 0; i < contoursDefect.size(); i++)
        {
         cv::Mat contour(contoursDefect.at(i));//第i个轮廓
         double area = contourArea(contour);
         cv::RotatedRect minRect = cv::minAreaRect(contour);
         cv::Rect rect = minRect.boundingRect2f();

         if (area >= 3500 && area <= 5000 && rect.width >= 130 && rect.width <= 300)
         {
             cv::drawContours(goodSmallRegion, contoursDefect, i, cv::Scalar(255), -1);

         }

         if (area >= 6000 && area <= 10000 && rect.width >= 350 && rect.width <= 550)
         {
             cv::drawContours(goodLongRegion, contoursDefect, i, cv::Scalar(255), -1);

         }

         if(hierarchyDefect[i][3] == -1 && area > 15000)
         {
             cv::drawContours(regionOut, contoursDefect, i, cv::Scalar(255), -1);

         }

         if(hierarchyDefect[i][3] != -1 && area > 15000)
         {
             cv::drawContours(regionIn, contoursDefect, i, cv::Scalar(255), -1);
         }


        }
        show(goodSmallRegion);
        show(goodLongRegion);
        show(regionOut);
        show(regionIn);
        cv::Mat result;
        void morphologyOperate(goodSmallRegion, goodLongRegion, regionOut, regionIn, result);
    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值