//探测故障 void CInTheBarCotterPinBreakOffDetector::DetectError(vector<SErrorInfoArray>& errorInfoArray, vector<Mat>& resultImageArray, /*vector<PositionOfComponents>& positionOfComponents,*/ int statues /*= 0*/) { //将车厢的方向统一 flip(m_srcImageArray[0], m_srcImageArray[0], 1); flip(resultImageArray[1], resultImageArray[1], 1); for (int i = 0; i != m_srcImageArray.size(); ++i) { float maxMatchVal = -1.0; Point matchPoint; int templateIndex = 0; int middleBarLeftLine = 0; //中间杆左边缘 int TruckDeadLeverTopLine = -1; //中拉杆上边缘 middleBarLeftLine = FindMiddleBarLeftLine(i); //获得中间杆的左边缘 if (IsMiddlBarLeftLineInRange(middleBarLeftLine)) { TruckDeadLeverTopLine = FindTruckDeadLeverTopLine(i, middleBarLeftLine); //获得中拉杆上边缘 } if (TruckDeadLeverTopLine == -1) { SErrorInfoArray sei; sei.errorMask |= DEMO_ERROR_PULL_ROD_IN_THE_COTTER_BREAKOFF; sei.errorImageFile = m_srcImageFileArray[i]; switch (i) { case 0: sei.leftPos = 300; sei.rightPos = 1000; sei.topPos = 250; sei.bottomPos = 750; break; case 1: sei.leftPos = 300; sei.rightPos = 1000; sei.topPos = 250; sei.bottomPos = 750; break; } sei.confidence = 52; sei.errorImageIndex = m_interstedIndex[i]; errorInfoArray.push_back(sei); rectangle(resultImageArray[m_interstedIndex[i]], Point(300,250),Point(1000,700),Scalar(0,0,255),2); continue; } else { for (int j = 0; j != m_templateImageArray.size(); ++j) { if (!IsValidRect(middleBarLeftLine + 80, TruckDeadLeverTopLine - 80, 400, 200)) { continue; } if (!IsValidRectInMat(m_srcImageArray[i], Rect(middleBarLeftLine + 80, TruckDeadLeverTopLine - 80, 400, 200))) { continue; } Rect roiRect(middleBarLeftLine + 80, TruckDeadLeverTopLine - 80, 400, 200); Mat compareResult; //匹配结果矩阵 //定义查找夹扣的ROI Mat searchBrakeBeamClamp_ROI = m_srcImageArray[i](roiRect); compareResult.create(searchBrakeBeamClamp_ROI.rows - m_templateImageArray[j].rows + 1, searchBrakeBeamClamp_ROI.cols - m_templateImageArray[j].cols + 1, CV_32FC1); matchTemplate(searchBrakeBeamClamp_ROI, m_templateImageArray[j], compareResult, CV_TM_CCOEFF_NORMED); //模板匹配 double minVal,maxVal; //矩阵中最小值,最大值 Point minLoc; //最小值的坐标 Point matchLoc; //最匹配值的坐标 minMaxLoc(compareResult, &minVal, &maxVal, &minLoc, &matchLoc, cv::Mat()); //寻找最匹配的点 if (maxVal > maxMatchVal) { maxMatchVal = maxVal; matchPoint.x = matchLoc.x + roiRect.x; matchPoint.y = matchLoc.y + roiRect.y; templateIndex = j; } } Rect roiRect(matchPoint.x, matchPoint.y, m_templateImageArray[templateIndex].cols, m_templateImageArray[templateIndex].rows); Ptr<FeatureDetector> detector = FeatureDetector::create( "SIFT" );//创建SIFT特征检测器 Ptr<DescriptorExtractor> descriptor_extractor = DescriptorExtractor::create( "SIFT" );//创建特征向量生成器 if( detector.empty() || descriptor_extractor.empty() ) { return; } Mat roiMat = m_srcImageArray[i](roiRect).clone(); vector<KeyPoint> keypoints; detector->detect(roiMat,keypoints); Mat descriptor; descriptor_extractor->compute(roiMat,keypoints,descriptor); Mat featureVec(1, 20*128, CV_32FC1); if (descriptor.rows >= 20) { for (int j = 0; j != 20; ++j) { for (int k = 0; k != descriptor.cols; ++k) { featureVec.at<float>(j*128+k) = descriptor.at<float>(j,k); } } } else { for (int j = 0; j != descriptor.rows; ++j) { for (int k = 0; k != descriptor.cols; ++k) { featureVec.at<float>(j*128+k) = descriptor.at<float>(j,k); } } for (int j = descriptor.rows; j != 20; ++j) { for (int k = 0; k != descriptor.cols; ++k) { featureVec.at<float>(j*128+k) = -1; } } } float flag = m_nbc.predict(featureVec); //进行预测 if(flag == -1) { SErrorInfoArray sei; sei.errorMask |= DEMO_ERROR_PULL_ROD_IN_THE_COTTER_BREAKOFF; sei.errorImageFile = m_srcImageFileArray[i]; switch (i) { case 0: sei.leftPos = 300; sei.rightPos = 1000; sei.topPos = 250; sei.bottomPos = 750; break; case 1: sei.leftPos = 300; sei.rightPos = 1000; sei.topPos = 250; sei.bottomPos = 750; break; } sei.confidence = 52; sei.errorImageIndex = m_interstedIndex[i]; rectangle(resultImageArray[m_interstedIndex[i]], Point(300,250),Point(1000,700),Scalar(0,0,255),2); errorInfoArray.push_back(sei); continue; } } } flip(m_srcImageArray[0], m_srcImageArray[0], 1); flip(resultImageArray[1], resultImageArray[1], 1); }
void Slic::_GenerateSuperpixels() { const int MAX_ITER = 10; for(int I=0;I<MAX_ITER;++I) { clock_t t1 = clock(); std::cout<<"This is the "<<I<<"th circulation:"<<std::endl; omp_init_lock(&lock); #pragma omp parallel for for(int n=0;n<_N;++n) { for(int m=0;m<_M;++m) { // Init int nXOff = m*_regionSize; int nYOff = n*_regionSize; int nXSize = m==(_M-1)? _width - m*_regionSize : _regionSize; int nYSize = n==(_N-1)? _height - n*_regionSize : _regionSize; uchar *bufferSrc = new uchar[nXSize*nYSize*_dataSize*_bandCount]; int *bufferDst = new int[nXSize*nYSize]; omp_set_lock(&lock); _poSrcDS->RasterIO(GF_Read,nXOff,nYOff,nXSize,nYSize,bufferSrc,nXSize,nYSize,_dataType,_bandCount,0,0,0,0); _poDstDS->GetRasterBand(1)->RasterIO(GF_Read,nXOff,nYOff,nXSize,nYSize,bufferDst,nXSize,nYSize,GDT_Int32,0,0); omp_unset_lock(&lock); std::vector< int > candidateCenterID; for(int i=-1;i<2;++i) { for(int j=-1;j<2;++j) { if ((n+i)>=0 && (n+i)<_N && (m+j)>=0 && (m+j)<_M) candidateCenterID.push_back( (n+i) * _M + (m+j) ) ; } } // GetFeatureInfo FeatureVector featureVec(_bandCount + 2); for(int i=0,index=0;i<nYSize;++i) { for(int j=0;j<nXSize;++j,++index) { uchar* p = bufferSrc; for(int k=0;k<_bandCount;++k,p += nXSize*nYSize*_dataSize) { featureVec[k]= SRCVAL(p,_dataType,index)/_regularizer; } featureVec[_bandCount] = static_cast<double>(nXOff+j)/_regionSize; //x featureVec[_bandCount+1] = static_cast<double>(nYOff+i)/_regionSize; //y bufferDst[i*nXSize+j] = _GetNearestCenter(candidateCenterID,featureVec); } } omp_set_lock(&lock); _poDstDS->GetRasterBand(1)->RasterIO(GF_Write,nXOff,nYOff,nXSize,nYSize,bufferDst,nXSize,nYSize,GDT_Int32,0,0); omp_unset_lock(&lock); delete []bufferSrc; delete []bufferDst; } } omp_destroy_lock(&lock); _ComputeNewCenterVector(); std::cout<<"This circle cost: "<<static_cast<double>(clock()-t1)/CLOCKS_PER_SEC<<"s"<<std::endl; } }
//探测故障 void CBrakeBeamEndShaftBreakOffDetector::DetectError(vector<SErrorInfoArray>& errorInfoArray, vector<Mat>& resultImageArray, /*vector<PositionOfComponents>& positionOfComponents,*/ int statues /*= 0*/) { for (int i = 0; i != m_srcImageArray.size(); ++i) { Rect roiRect; switch (i) { case 0: roiRect.x = m_srcImageArray[i].cols/5; roiRect.y = 0; roiRect.width = m_srcImageArray[i].cols/4; roiRect.height = 200; break; case 1: roiRect.x = m_srcImageArray[i].cols/5+100; roiRect.y = m_srcImageArray[i].rows/2+300; roiRect.width = m_srcImageArray[i].cols/4; roiRect.height = 200; break; case 2: roiRect.x = m_srcImageArray[i].cols/5*3-100; roiRect.y = 0; roiRect.width = m_srcImageArray[i].cols/4; roiRect.height = 200; break; case 3: roiRect.x = m_srcImageArray[i].cols/2+60; roiRect.y = m_srcImageArray[i].rows/2+300; roiRect.width = m_srcImageArray[i].cols/4; roiRect.height = 200; break; default: break; } CHistogram1D h; if (!IsValidRectInMat(m_srcImageArray[i],roiRect)) { continue; } Mat roiMat = m_srcImageArray[i](roiRect); roiMat = h.equalize(roiMat); Ptr<FeatureDetector> detector = FeatureDetector::create( "SIFT" );//创建SIFT特征检测器 Ptr<DescriptorExtractor> descriptor_extractor = DescriptorExtractor::create( "SIFT" );//创建特征向量生成器 if( detector.empty() || descriptor_extractor.empty() ) { return; } vector<KeyPoint> keypoints; detector->detect(roiMat,keypoints); Mat descriptor; descriptor_extractor->compute(roiMat,keypoints,descriptor); Mat featureVec(1, 20*128, CV_32FC1); if (descriptor.rows >= 20) { for (int j = 0; j != 20; ++j) { for (int k = 0; k != descriptor.cols; ++k) { featureVec.at<float>(j*128+k) = descriptor.at<float>(j,k); } } } else { for (int j = 0; j != descriptor.rows; ++j) { for (int k = 0; k != descriptor.cols; ++k) { featureVec.at<float>(j*128+k) = descriptor.at<float>(j,k); } } for (int j = descriptor.rows; j != 20; ++j) { for (int k = 0; k != descriptor.cols; ++k) { featureVec.at<float>(j*128+k) = -1; } } } float flag = m_nbc.predict(featureVec); //进行预测 if(flag == -1) { SErrorInfoArray sei; sei.errorMask |= DEMO_ERROR_BRAKE_BEAM_END_SHAFT_BREAKOFF; sei.realErrorMask |= DEMO_ERROR_BRAKE_BEAM_END_SHAFT_BREAKOFF; sei.errorImageFile = m_srcImageFileArray[i]; sei.leftPos = roiRect.x; sei.rightPos = roiRect.x+roiRect.width; sei.topPos = roiRect.y; sei.bottomPos = roiRect.y+roiRect.height; sei.confidence = 63; sei.errorImageIndex = m_interstedIndex[i]; errorInfoArray.push_back(sei); rectangle(resultImageArray[m_interstedIndex[i]], Point(sei.leftPos,sei.topPos),Point(sei.rightPos,sei.bottomPos),Scalar(0,0,255),2); } } }