示例#1
0
文件: hough.cpp 项目: OpenGelo/iarc
//Takes avg pixel color value (3x3 grid)
CvScalar avgpixelcolor(IplImage*image,CvPoint seed,int gridSize){
    CvScalar pixColor;
    cvSetImageROI(image, cvRect(seed.x,seed.y,gridSize,gridSize));  //Restrict Color Avg to ROI

    IplImage*b=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1); //Channel Holders
    IplImage*g=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);
    IplImage*r=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,1);

    cvSplit(image,b,g,r,NULL);  //Split Color Spaces and Average
    pixColor.val[0]=cvMean(b);
    pixColor.val[1]=cvMean(g);
    pixColor.val[2]=cvMean(r);

    cvResetImageROI(image);
    cvReleaseImage(&b);
    cvReleaseImage(&g);
    cvReleaseImage(&r);
    return pixColor;
}
示例#2
0
double ImageProcessorCV::Mean(CByteImage *pImage1, CByteImage *pImage2)
{
	if (pImage1->width != pImage2->width || pImage1->height != pImage2->height ||
		pImage1->type != pImage2->type || pImage1->type != CByteImage::eGrayScale)
		return -1;
		
	IplImage *pIplImage1 = IplImageAdaptor::Adapt(pImage1);
	IplImage *pIplImage2 = IplImageAdaptor::Adapt(pImage2);
	
	double dRet = cvMean(pIplImage1, pIplImage2);
	
	cvReleaseImageHeader(&pIplImage1);
	cvReleaseImageHeader(&pIplImage2);
	
	return dRet;
}
void pix_opencv_patreco :: loadMess (t_symbol *s, int argc, t_atom* argv)
{
	t_symbol* filename;
	int id;
	
	if ( argc != 2 ) {
		error("wrong arguments : load <id> <filename>");
		return;
	} else if ( argv[0].a_type != A_FLOAT ||  argv[1].a_type != A_SYMBOL ) {
		error("wrong arguments : load <id> <filename>");
		return;
	} else {
		id = atom_getfloat(&argv[0]);
		filename = atom_getsymbol(&argv[1]);
	}
		
	
	if ( filename->s_name[0] == 0 ) {
		error("no filename passed to load message");
		return;
	}
	if ( filename == NULL ) { 
		error("%s is not a valid matrix", filename->s_name); 
		return;
	}
	
	Mat img = imread(filename->s_name,0);
	
	if ( img.data == NULL ){
		error("failed to load image '%s'", filename->s_name);
		puts("failed to laod images");
		return;
	}
	
	if(img.cols!=img.rows){
		error("%s is not a square pattern", filename->s_name);
		puts("not a square pattern");
		return;
	}

	cv::Mat src(m_pattern_size, m_pattern_size, CV_8UC1);
	Point2f center((m_pattern_size-1)/2.0f,(m_pattern_size-1)/2.0f);
	Mat rot_mat(2,3,CV_32F);
	
	//~ std::map<int PatternLib>::iterator it;
	//~ it = m_patternLibrary.find(id);
	//~ if ( m_patternLibrary.find(id) != m_patternLibrary.end() ){
		// TODO remove item from the map
	//~ }

	PatternLib pattern;
	pattern.id = id;
		
	cv::resize(img, src, Size(m_pattern_size,m_pattern_size));
	if ( m_detector->m_ART_pattern ) {
		Mat subImg = src(cv::Range(m_pattern_size/4,3*m_pattern_size/4), cv::Range(m_pattern_size/4,3*m_pattern_size/4));
		pattern.pattern[0]  = subImg;
		pattern.mean[0] = cvMean(&((CvMat)subImg));
		pattern.norm[0] = cv::norm(subImg, NORM_L1);
		//~ m_patternLibrary.push_back(subImg);
	}
	else {
		//~ m_patternLibrary.push_back(src);
		pattern.pattern[0]  = src;
		pattern.mean[0] = cvMean(&((CvMat)src));
		pattern.norm[0] = cv::norm(src, NORM_L1);
	}
	
	rot_mat = getRotationMatrix2D( center, 90, 1.0);

	for (int i=1; i<4; i++){
		Mat dst= Mat(m_pattern_size, m_pattern_size, CV_8UC1);
		rot_mat = getRotationMatrix2D( center, -i*90, 1.0);
		cv::warpAffine( src, dst , rot_mat, Size(m_pattern_size,m_pattern_size));
		if ( m_detector->m_ART_pattern ) {
			Mat subImg = dst(cv::Range(m_pattern_size/4,3*m_pattern_size/4), cv::Range(m_pattern_size/4,3*m_pattern_size/4)); // AV crop 25% on each side -> specific to AR tag ?
			pattern.pattern[i];
			pattern.mean[i] = cvMean(&((CvMat)subImg));
			pattern.norm[i] = cv::norm(subImg, NORM_L1);
			//~ m_patternLibrary.push_back(subImg);	
		} else {
			pattern.pattern[i] = dst;
			pattern.mean[i] = cvMean(&((CvMat)dst));
			pattern.norm[i] = cv::norm(dst, NORM_L1);			
			//~ m_patternLibrary.push_back(dst);
		}
	}

	t_atom data_out;
	SETFLOAT(&data_out, m_patternLibrary.size());
	outlet_anything( m_dataout, gensym("patternCount"), 1, &data_out);
}