//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; }
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); }