//探测故障
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);
}
예제 #2
0
파일: slic.cpp 프로젝트: chenguanzhou/SLIC
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);
		}
	}
}