opencv识别物体上的黑色污点

#include "stdafx.h" 
#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/calib3d/calib3d.hpp> 
#include <opencv2/highgui/highgui.hpp> 
  
void thredChange(cv::InputArray src,cv::OutputArray dst) 

     cv::threshold(src,dst,180,255,CV_THRESH_BINARY_INV); 

  
void filterPoints(cv::Mat image,cv::Mat result) 

     // allocate if necessary 
     //result.create(image.size(), image.type()); 
     for(int j=0;j<image.rows;++j) 
         result.row(j).setTo(cv::Scalar(0)); 
  
     int d=10; 
     for (int j= d; j<image.rows-d; j++) { // for all rows 
         // (except first and last) 
         const uchar* previous= 
             image.ptr<const uchar>(j-d); // previous row 
         const uchar* current= 
             image.ptr<const uchar>(j); // current row 
         const uchar* next= 
             image.ptr<const uchar>(j+d); // next row 
  
         uchar* output= result.ptr<uchar>(j); // output row 
         for (int i=d; i<image.cols-d; i++) { 
             if(current[i]!=255|| 
                 current[i-d]!=0|| 
                 current[i+d]!=0|| 
                 previous[i]!=0|| 
                 previous[i-d]!=0|| 
                 previous[i+d]!=0|| 
                 previous[i+1]!=0|| 
                 previous[i+2]!=0|| 
                 previous[i+3]!=0|| 
                 previous[i+4]!=0|| 
                 previous[i-4]!=0|| 
                 previous[i-3]!=0|| 
                 previous[i-2]!=0|| 
                 previous[i-1]!=0|| 
                 next[i-d]!=0|| 
                 next[i+d]!=0|| 
                 next[i-1]!=0|| 
                 next[i-2]!=0|| 
                 next[i-3]!=0|| 
                 next[i-4]!=0|| 
                 next[i+1]!=0|| 
                 next[i+2]!=0|| 
                 next[i+3]!=0|| 
                 next[i+4]!=0|| 
                 next[i]!=0 
                 ) 
                 *output++=0; 
             else 
                 *output++=255; 
         } 
     } 

void removeLittle(cv::Mat image,cv::Mat result,int num) 

     // allocate if necessary 
     //result.create(image.size(), image.type()); 
     for(int j=0;j<image.rows;++j) 
         result.row(j).setTo(cv::Scalar(0)); 
  
     int d=1; 
     for (int j= d; j<image.rows-d; j++) { // for all rows 
         // (except first and last) 
         const uchar* previous= 
             image.ptr<const uchar>(j-d); // previous row 
         const uchar* current= 
             image.ptr<const uchar>(j); // current row 
         const uchar* next= 
             image.ptr<const uchar>(j+d); // next row 
  
         uchar* output= result.ptr<uchar>(j); // output row 
         for (int i=d; i<image.cols-d; i++) { 
             int a=current[i]+current[i-1]+current[i+1] 
             +previous[i-1]+previous[i]+previous[i+1] 
             +next[i-1]+next[i]+next[i+1]; 
             if((current[i]==255)&& 
                 (a>255*num)) 
                 *output++=255; 
             else 
                 *output++=0; 
         } 
     } 

  
int _tmain(int argc, _TCHAR* argv[]) 

     cv::Mat image=cv::imread("./data/test1/points.jpg",CV_LOAD_IMAGE_GRAYSCALE); 
     cv::Mat p2; 
     cv::Mat p3=image.clone();; 
     cv::Mat p4=image.clone(); 
     cv::Mat p5=image.clone(); 
  
     thredChange(image,p2); 
     filterPoints(p2,p3); 
     removeLittle(p3,p4,5); 
     removeLittle(p4,p5,3); 
  
     cv::namedWindow("gui"); 
     cv::imshow("gui",p5); 
     cv::waitKey(0); 
     return 0; 

  
  
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值