vector<VisionRecognitionResult> KITECH_HSVColorRecognitionComp::Recognize(vector<unsigned char> image,int width,int height,int pixelBytes) { //PrintMessage("SUCCESS:KITECH_HSVColorRecognitionComp::Recognize()"); vector<VisionRecognitionResult> _recognitionResult(0); VisionRecognitionResult tmpResult; IplImage *cvImage = cvCreateImageHeader( cvSize(width, height), 8, pixelBytes ); cvImage->imageData = (char *)&image[0]; IplImage *hsvImage = cvCreateImage( cvGetSize(cvImage), 8, pixelBytes ); cvCvtColor(cvImage, hsvImage, CV_BGR2HSV); IplImage *cvMask= cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); for( unsigned int p = 0 ; p < _colorRange.size() ; p++ ) { cvInRangeS( hsvImage, cvScalar(_colorRange[p].min1,_colorRange[p].min2,_colorRange[p].min3,0), cvScalar(_colorRange[p].max1,_colorRange[p].max2,_colorRange[p].max3,255), cvMask ); CBlobLabeling blob; blob.SetParam( cvMask, width*height/1000 ); blob.DoLabeling(); // _recognitionResult.resize(blob.m_nBlobs); for( int i = 0 ; i < blob.m_nBlobs ; i++ ) { tmpResult.name = _colorRange[p].name; tmpResult.point1X = blob.m_recBlobs[i].x; tmpResult.point1Y = blob.m_recBlobs[i].y; tmpResult.point2X = blob.m_recBlobs[i].x + blob.m_recBlobs[i].width; tmpResult.point2Y = blob.m_recBlobs[i].y; tmpResult.point3X = blob.m_recBlobs[i].x + blob.m_recBlobs[i].width; tmpResult.point3Y = blob.m_recBlobs[i].y + blob.m_recBlobs[i].height; tmpResult.point4X = blob.m_recBlobs[i].x; tmpResult.point4Y = blob.m_recBlobs[i].y + blob.m_recBlobs[i].height; _recognitionResult.push_back(tmpResult); //PrintMessage("SUCCESS:KITECH_HSVColorRecognitionComp::Recognize() -> I found %d data.(%d=%s)\n", blob.m_nBlobs, i, tmpResult.name.c_str()); } } //cvSaveImage("KITECH_HSVColorRecognitionComp.jpg", cvImage); cvReleaseImage(&cvMask); cvReleaseImage(&hsvImage); cvReleaseImageHeader(&cvImage); return _recognitionResult; }
vector<VisionRecognitionResult> KitechSkinColorFaceRecognitionComp::Recognize(vector<unsigned char> image,int width,int height,int pixelBytes) { vector<VisionRecognitionResult> _recognitionResult(0); IplImage *cvImage = cvCreateImageHeader( cvSize(width, height), 8, pixelBytes ); cvImage->imageData = (char *)&(image)[0]; IplImage *ycrcbImage = cvCreateImage( cvGetSize(cvImage), 8, pixelBytes ); cvCvtColor(cvImage, ycrcbImage, CV_BGR2YCrCb); IplImage *cvMask= cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 ); cvInRangeS( ycrcbImage, cvScalar(0,133,77), cvScalar(255,173,127), cvMask ); CBlobLabeling blob; blob.SetParam( cvMask, width*height/100 ); blob.DoLabeling(); _recognitionResult.resize(blob.m_nBlobs); for( int i = 0 ; i < blob.m_nBlobs ; i++ ) { _recognitionResult[i].name = "Face"; _recognitionResult[i].point1X = blob.m_recBlobs[i].x; _recognitionResult[i].point1Y = blob.m_recBlobs[i].y; _recognitionResult[i].point2X = blob.m_recBlobs[i].x + blob.m_recBlobs[i].width; _recognitionResult[i].point2Y = blob.m_recBlobs[i].y; _recognitionResult[i].point3X = blob.m_recBlobs[i].x + blob.m_recBlobs[i].width; _recognitionResult[i].point3Y = blob.m_recBlobs[i].y + blob.m_recBlobs[i].height; _recognitionResult[i].point4X = blob.m_recBlobs[i].x; _recognitionResult[i].point4Y = blob.m_recBlobs[i].y + blob.m_recBlobs[i].height; //PrintMessage("SUCCESS:KitechSkinColorFaceRecognitionComp::recognize() -> I found %d data.(%d=%s)\n", blob.m_nBlobs, i, _recognitionResult[i].name.c_str()); } //cvSaveImage("KitechSkinColorFaceRecognitionComp.jpg", cvImage); cvReleaseImage(&cvMask); cvReleaseImage(&ycrcbImage); cvReleaseImageHeader(&cvImage); return _recognitionResult; }
void imageCallback(const sensor_msgs::ImageConstPtr& msg) { try { cv::Mat img21 = cv_bridge::toCvShare(msg, "bgr8")->image; //cv::imshow("view",img21 ); frame_color_ycrcb = cv::Mat::zeros(480, 640 ,CV_8UC3); /////// //Get the corners from the object Capframe_one =img21; imshow("dsd",Capframe_one); // if(Capframe_one.empty()) break; // Capframe_one=imread("RR.jpg"); frame_color_ycrcb=Capframe_one; frame_color_ycrcb_vel=frame_color_ycrcb.clone(); frame_color_ycrcb.copyTo(frame_color_ycrcb_tri); //YCrCbÀ̹ÌÁö·Î º¯°æ Mat YCrCb, mask(frame_color_ycrcb.size(), CV_8U, Scalar(0)); cvtColor(frame_color_ycrcb, YCrCb, CV_BGR2YCrCb); //YCrCb À̹ÌÁöžŠ °¢ À³Îº°·Î ºÐž® vector<Mat> planes; split(YCrCb, planes); int nr=frame_color_ycrcb.rows; int nc=frame_color_ycrcb.cols; // 170 < Cr <230, 70 <Cb < 130ÀÎ ¿µ¿ªžž 255·Î Ç¥œÃÇØŒ mask žžµé±â for(int i=0; i<nr; i++){ uchar* Cr=planes[1].ptr<uchar>(i); uchar* Cb=planes[2].ptr<uchar>(i); for(int j=0; j<nc;j++){ //if((140<Cr[j] && Cr[j] <240) && (50<Cb[j] && Cb[j]<150) ) // if((170<Cr[j] && Cr[j] <250) && (70<Cb[j] && Cb[j]<180) ) if((130<Cr[j] && Cr[j] <220) && (40<Cb[j] && Cb[j]<140) ) mask.at<uchar>(i, j)=255; } } GaussianBlur(mask, mask, Size(3, 3), 2, 2); imshow("MASK", mask); img_gray=mask; drawStuff(); vector<Vec3f> circles; std::vector<cv::Vec3f> circles2; Mat abcd; cvtColor(frame_color_ycrcb_vel, abcd, CV_BGR2GRAY); // HoughCircles(mask, circles, CV_HOUGH_GRADIENT, 2, 1000,20,95,2,50); HoughCircles(abcd, circles, CV_HOUGH_GRADIENT, 2,frame_color_ycrcb_vel.rows/4,200,100,2,50); std::vector<cv::Vec3f>::iterator itc_R = circles.begin(); double count_circle=0; while (itc_R != circles.end()) { count_circle++; // std::cout << count_circle << std::endl; ++itc_R; } for(int i=0; i<circles.size(); i++) { Point center((circles[i][0]), (circles[i][1])); int radius=(circles[i][2]); double b=-70; Rect ROI_Rect((double)circles[i][0] - (double)circles[i][2]-b/(double)circles[i][2], (double)circles[i][1] - (double)circles[i][2]-b/(double)circles[i][2], (double)circles[i][2] * 2+b*2/(double)circles[i][2], (double)circles[i][2] * 2+b*2/(double)circles[i][2]); // std::cout << "rect_draw" << std::endl; // printf("one dectect"); // circle(frame_color_ycrcb, center, radius, Scalar(0,255,0), 1); if( ((circles[i][0] - circles[i][2]-100)>=0 )&& ((circles[i][0] + circles[i][2]+100)<=640)&& ((circles[i][1] + circles[i][2]+100)<=480)&& ((circles[i][1] - circles[i][2]-100)>=0)) { Mat Temp_ROI,circle_ROI,Temp_ROI_vel; frame_color_ycrcb_vel(ROI_Rect).copyTo(Temp_ROI_vel); cvtColor(Temp_ROI_vel,Temp_ROI_vel,CV_YCrCb2BGR); Mat Temp_vel_gray; Mat Temp_vel_gray_ROI; double c=12; double d=1.35; if(((double)circles[i][2])>=35.0){ d=1; } if(((double)circles[i][2])<=21.0&&((double)circles[i][2])>=17.0){ d=1; } Rect ROI_Rect_vel(((double)(circles[i][0])-((double)(circles[i][2]))), ((double)(circles[i][1])-((double)(circles[i][2]))), (double)(circles[i][2])*2, ((double)(circles[i][2]))*2); vector<Rect> Rect_Vector; if((0<=((double)(circles[i][0])-((double)(circles[i][2])/1.414213)+((double)(circles[i][2])/1.414213)*2)<=640 )&& (0<=((double)(circles[i][0])-((double)(circles[i][2])/1.414213)+((double)(circles[i][2])/1.414213)*2)>=0 )&& ((((double)(circles[i][1])-((double)(circles[i][2])/1.414213))+((double)(circles[i][2])/1.414213)*2)<=480)&& ((((double)(circles[i][1])-((double)(circles[i][2])/1.414213))+((double)(circles[i][2])/1.414213)*2)>=0)) { Mat vel_ocr; Temp_vel_gray_ROI=frame_color_ycrcb_vel.clone(); Mat Temp_vel_gray_ROI_2; int x, y, x2, y2; if (radius > 25){ x = cvRound(circles[i][0]) - (radius*0.8); // ¹ÝÁöž§ÀÌ 25ºžŽÙ Å«°æ¿ì y = cvRound(circles[i][1]) - (radius*0.6); if (x > 0 && y > 0){ Temp_vel_gray_ROI_2 = Temp_vel_gray_ROI(Rect(x, y, 1.6 * radius, 1.2*radius)); imshow("ROI", Temp_vel_gray_ROI_2); } } else{ x = cvRound(circles[i][0]) - (radius*0.8); // ¹ÝÁöž§ÀÌ 25ºžŽÙ Å«°æ¿ì y = cvRound(circles[i][1]) - (radius*0.6); if (x > 0 && y > 0){ Temp_vel_gray_ROI_2= Temp_vel_gray_ROI(Rect(x, y, 1.8 * radius, 1.4*radius)); imshow("ROI", Temp_vel_gray_ROI_2); } } if (x > 0 && y > 0){ if (2 * radius < 80){ CBlobLabeling blob; //cvtColor(Temp_vel_gray_ROI,Temp_vel_gray_ROI,CV_BGR2GRAY); IplImage *out = new IplImage(Temp_vel_gray_ROI_2); IplImage * gray=cvCreateImage(cvSize(out->width,out->height),8,1); cvCvtColor(out,gray,CV_BGR2GRAY); cvThreshold(gray,gray,126,255,CV_THRESH_BINARY_INV); //cvThreshold(gray,gray,126,255,CV_THRESH_BINARY|CV_THRESH_OTSU); IplImage * labeled=cvCreateImage(cvSize(out->width,out->height),8,3); cvCvtColor(gray,labeled,CV_GRAY2BGR); blob.SetParam(gray, 25); blob.DoLabeling(); int x_min = 100; int x_max = 0; int y_min = 100; int y_max = 0; printf("라벨링 개수: %d\n", blob.m_nBlobs); for (int i = 0; i < blob.m_nBlobs; i++) { CvPoint pt1 = cvPoint(blob.m_recBlobs[i].x, blob.m_recBlobs[i].y); CvPoint pt2 = cvPoint(pt1.x + blob.m_recBlobs[i].width, pt1.y + blob.m_recBlobs[i].height); if (x_max < pt2.x) x_max = pt2.x; if (x_min > pt1.x) x_min = pt1.x; if (y_max < pt2.y) y_max = pt2.y; if (y_min > pt1.y) y_min = pt1.y; } // printf("%d : %d %d %d %d\n", blob.m_nBlobs, x_max, x_min, y_max, y_min); // °¢ ·¹À̺í Ç¥œÃ CvPoint pt1 = cvPoint(x_min, y_min); CvPoint pt2 = cvPoint(x_min + (x_max - x_min), y_min + (y_max - y_min)); CvScalar color = cvScalar(0, 0, 255); //cvDrawRect(labeled, pt1, pt2, color); Rect rect1(1+pt1.x, 1+pt1.y, pt2.x-1, pt2.y-1); if( rect1.width >= 0 && rect1.height >= 0 && rect1.x < labeled->width && rect1.y < labeled->height && rect1.x + rect1.width >= (int)(rect1.width > 0) && rect1.y + rect1.height >= (int)(rect1.height > 0)){ cvSetImageROI(labeled, rect1); //printf("%d \n", blob.m_nBlobs); Mat labeling(labeled); cvtColor(labeling, labeling, CV_RGB2GRAY); threshold(labeling, labeling, 100, 255, 0); countnum(labeling); //imshow("temp_vel_gray_ROI",Temp_vel_gray_ROI); imshow("labeling", labeling); //waitKey(0); cvReleaseImage(&labeled); } } } } } } imshow("IMAGE", frame_color_ycrcb); ////// } catch (cv_bridge::Exception& e) { ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str()); } }
void main() { CvCapture *capture; IplImage * Image; UDPClient *client = new UDPClient(addr, port); int Dang = 0; capture = cvCaptureFromFile("[mix]test.mp4"); IplImage * median; IplImage * gray; IplImage * sendimage; IplImage * faceimage; IplImage * fa_gr_image; IplImage * mosaimage; IplImage * mosaimage1; IplImage *canny; IplImage * out1; IplImage *send3image; double a, b, x0, y0,busx=0.0,bus=0.0,k1,k2,angle1,temp; float *line, rho, theta; CvMemStorage *storage; CvSeq *lines = 0; CvPoint *point, pt1, pt2; while(1) { bool movecheck = false; char endkey; Image=cvQueryFrame(capture); if(!Image) break; send3image = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3); mosaimage = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3); mosaimage1 = cvCreateImage(cvSize(1,1), IPL_DEPTH_8U, 3); faceimage = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3); fa_gr_image = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 1); gray = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 1); sendimage = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 1); canny = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 1); IplImage *realhough = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3); IplImage *probhough = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3); cvCvtColor(Image, sendimage, CV_RGB2GRAY); cvCvtColor(Image, gray, CV_RGB2GRAY); cvCopy(Image,faceimage); cvCopy(Image,mosaimage); cvCopy(Image,send3image); gaussian(gray); //open SW cvSmooth(gmmframe,gmmframe,CV_MEDIAN,5); cvMorphologyEx(gmmframe,gmmframe,0,0,CV_MOP_CLOSE,2); detectskin(faceimage); //open SW cvCanny(gray, canny,60,70,3); storage = cvCreateMemStorage (0); lines = cvHoughLines2 (canny, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 80, 0,0); for(int i = 0; i< MIN(lines->total, 100); i++) { line =(float*) cvGetSeqElem(lines, i); rho = line[0]; theta = line[1]; a = cos (theta); b = sin (theta); x0 = a*rho; y0 = b*rho; pt1.x =cvRound(x0 + 500 * (-b)); pt1.y =cvRound(y0 + 500 * (a)); pt2.x =cvRound(x0 - 500 * (-b)); pt2.y =cvRound(y0 - 500 * (a)); k1=(pt1.x-pt2.x); k2=pt1.y-pt2.y; angle1=k1/k2; if(0.08>angle1) { if(pt1.x>170 &&pt1.x<gmmframe->width) { cvLine (realhough, pt1,pt2,CV_RGB(255, 0,0), 1, 8,0); temp=pt1.x; } } } for(int i=0; i<gmmframe->height; i++) { for(int j = 0; j<gmmframe->width; j++) { if(j>temp) gmmframe->imageData[j+gmmframe->widthStep*i]=0; } } if(frameCnt>25) { CBlobLabeling blob; //open SW(labeling) blob.SetParam(gmmframe, 100 ); blob.DoLabeling(); if(blob.m_nBlobs>0) { printf("%d", blob.m_nBlobs); printf("명이 있습니다 \n"); } int face_size = blob.m_nBlobs; int face_x1[100],face_x2[100]; int face_y1[100],face_y2[100]; for(int i=0; i< blob.m_nBlobs; i++) { cvDrawRect(Image,cvPoint(blob.m_recBlobs[i].x,blob.m_recBlobs[i].y), cvPoint(blob.m_recBlobs[i].x+blob.m_recBlobs[i].width, blob.m_recBlobs[i].y+blob.m_recBlobs[i].height), CV_RGB(255,0,0),2); if((blob.m_recBlobs[i].width>=(double)Image->width/3)&&(blob.m_recBlobs[i].height>=(double)Image->height*0.75)) movecheck = true; face_x1[i] = blob.m_recBlobs[i].x; face_x2[i] = blob.m_recBlobs[i].x+blob.m_recBlobs[i].width; face_y1[i] = blob.m_recBlobs[i].y; face_y2[i] = blob.m_recBlobs[i].y+blob.m_recBlobs[i].height/3; } if(movecheck == true) continue; else{ int mosa_cnt = 0; double mosa_var_r = 0; double mosa_var_g = 0; double mosa_var_b = 0; for(int i=0; i<faceimage->height; i++){ for(int j=0; j<faceimage->width; j++){ bool face_t = false; if(faceimage->imageData[(i*faceimage->widthStep)+j*3+0]!=0 || faceimage->imageData[(i*faceimage->widthStep)+j*3+1]!=0 || faceimage->imageData[(i*faceimage->widthStep)+j*3+2]!=0){ for(int t=0; t<blob.m_nBlobs; t++){ if(j>=face_x1[t] && j<=face_x2[t] && i>=face_y1[t] && i<=face_y2[t]){ face_t = true; } } } if(face_t == false){ faceimage->imageData[(i*faceimage->widthStep)+j*3+2] = 0; faceimage->imageData[(i*faceimage->widthStep)+j*3+1] = 0; faceimage->imageData[(i*faceimage->widthStep)+j*3+0] = 0; } } } cvCvtColor(faceimage, fa_gr_image, CV_RGB2GRAY); CBlobLabeling blob1; blob1.SetParam(fa_gr_image, 3); blob1.DoLabeling(); for(int i=0; i<mosaimage->height; i++){ for(int j=0; j<mosaimage->width; j++){ for(int t=0; t<blob1.m_nBlobs; t++){ int mosa_wid = blob1.m_recBlobs[t].width*0.5; int mosa_hei = blob1.m_recBlobs[t].height*0.5; if(j>blob1.m_recBlobs[t].x-mosa_wid && j<(blob1.m_recBlobs[t].width+blob1.m_recBlobs[t].x)+mosa_wid && i>blob1.m_recBlobs[t].y -mosa_hei && i<(blob1.m_recBlobs[t].height+blob1.m_recBlobs[t].y)+mosa_hei){ mosa_var_b += (unsigned char)mosaimage->imageData[(i*mosaimage->widthStep)+j*3+0]; mosa_var_g += (unsigned char)mosaimage->imageData[(i*mosaimage->widthStep)+j*3+1]; mosa_var_r += (unsigned char)mosaimage->imageData[(i*mosaimage->widthStep)+j*3+2]; mosa_cnt++; } } } } mosa_var_b /= mosa_cnt; mosa_var_g /= mosa_cnt; mosa_var_r /= mosa_cnt; for(int i=0; i<faceimage->height; i++){ for(int j=0; j<faceimage->width; j++){ for(int t=0; t<blob1.m_nBlobs; t++){ int mosa_wid = blob1.m_recBlobs[t].width*0.5; int mosa_hei = blob1.m_recBlobs[t].height*0.5; if(j>blob1.m_recBlobs[t].x-mosa_wid && j<(blob1.m_recBlobs[t].width+blob1.m_recBlobs[t].x)+mosa_wid && i>blob1.m_recBlobs[t].y -mosa_hei && i<(blob1.m_recBlobs[t].height+blob1.m_recBlobs[t].y)+mosa_hei){ mosaimage->imageData[(i*mosaimage->widthStep)+j*3+2] = (unsigned char)(int)mosa_var_r; mosaimage->imageData[(i*mosaimage->widthStep)+j*3+1] = (unsigned char)(int)mosa_var_g; mosaimage->imageData[(i*mosaimage->widthStep)+j*3+0] = (unsigned char)(int)mosa_var_b; } } } } for(int i=0; i<send3image->height; i++){ for(int j=0; j<send3image->width; j++){ if(send3image->imageData[j*3+0+i*send3image->widthStep]==0) send3image->imageData[j*3+0+i*send3image->widthStep]+=1; if(send3image->imageData[j*3+1+i*send3image->widthStep]==0) send3image->imageData[j*3+1+i*send3image->widthStep]+=1; if(send3image->imageData[j*3+2+i*send3image->widthStep]==0) send3image->imageData[j*3+2+i*send3image->widthStep]+=1; } } char *buff = new char[30000]; int snsz = 30000; int x = strlen(send3image->imageData)/snsz+2; int y = strlen(send3image->imageData)%snsz; char end[10] = "end"; int cnt1 = 0; for(int i = 0; i<x; i++) { int snsz1; if(i < x-2) snsz1 = snsz; else snsz1 = y; if(i == x-1) strcpy(buff,end); else strncpy(buff,send3image->imageData+(i*snsz),snsz1); int result = client->sendData((char*)(&buff[0]), strlen(buff)); cnt1++; if(result < 0) cout<<"전송 실패"<<endl; } for(int i=0; i<mosaimage->height; i++){ for(int j=0; j<mosaimage->width; j++){ if(mosaimage->imageData[j*3+0+i*mosaimage->widthStep]==0) mosaimage->imageData[j*3+0+i*mosaimage->widthStep]+=1; if(mosaimage->imageData[j*3+1+i*mosaimage->widthStep]==0) mosaimage->imageData[j*3+1+i*mosaimage->widthStep]+=1; if(mosaimage->imageData[j*3+2+i*mosaimage->widthStep]==0) mosaimage->imageData[j*3+2+i*mosaimage->widthStep]+=1; } } x = strlen(mosaimage->imageData)/snsz+2; y = strlen(mosaimage->imageData)%snsz; cnt1 = 0; for(int i = 0; i<x; i++) { int snsz1; if(i < x-2) snsz1 = snsz; else snsz1 = y; if(i == x-1) strcpy(buff,end); else strncpy(buff,mosaimage->imageData+(i*snsz),snsz1); int result = client->sendData((char*)(&buff[0]), strlen(buff)); cnt1++; if(result < 0) cout<<"전송 실패"<<endl; } if(blob.m_nBlobs == 0 ) { PlaySound(0,0,0); Dang = 0; } else if(blob.m_nBlobs!=0 && Dang == 0) { PlaySound("wav.wav",NULL,SND_ASYNC | SND_LOOP); Dang = 1; } } cvShowImage("Image",Image); cvShowImage("back",gmmframe); cvShowImage("face",faceimage); cvShowImage("mosaic",mosaimage); cvShowImage("Canny", canny ); cvShowImage("Real Hough Transform", realhough); } cvReleaseImage(&gmmframe); cvReleaseImage(&faceimage); cvReleaseImage(&mosaimage); cvReleaseImage(&canny); cvReleaseImage(&realhough); cvReleaseImage(&send3image); cvReleaseImage(&fa_gr_image); endkey = cvWaitKey(1); if(endkey ==27) break; } }
JNIEXPORT jstring JNICALL Java_kr_ac_ajou_ddozzip_calmera_OpencvActivity_FindFeatures(JNIEnv* env, jobject obj, jlong addrGray, jlong addrRgba) { int g_switch_value = 0; jstring outFormula; Mat* pMatRgb=(Mat*)addrRgba; Mat* pMatGr=(Mat*)addrGray; Mat MatRgb = *pMatRgb; Mat MatGr = *pMatGr; IplImage rgbImg = MatRgb; IplImage grayImg = MatGr; IplImage* pGrayImg = &grayImg; IplImage* pRgbImg = &rgbImg; IplImage labeledImg; Mat* pMatLabeled; Mat MatLabeled; vector<KeyPoint> v; string formula; string strTemp = ""; //binary Process 반전 cvtColor(*pMatRgb, *pMatGr, CV_BGR2GRAY); threshold( *pMatGr, *pMatGr, 127.0, 255.0, CV_THRESH_BINARY_INV | CV_THRESH_OTSU); //IplImage로 변환 MatGr = *pMatGr; grayImg = Mat(MatGr); pGrayImg = &grayImg; IplImage* pLabeledImg = cvCreateImage(cvSize(pGrayImg->width, pGrayImg->height), 8, 3); IplImage* pGrayImg_inv = cvCreateImage(cvSize(pGrayImg->width, pGrayImg->height), 8, pGrayImg->nChannels); IplConvKernel *element1; element1 = cvCreateStructuringElementEx (3, 3, 2, 2, CV_SHAPE_RECT, NULL); IplConvKernel *element2; element2 = cvCreateStructuringElementEx (3, 3, 2, 2, CV_SHAPE_RECT, NULL); // 필터의 크기를 5x5로 설정 cvDilate( pGrayImg, pGrayImg, element1, 1); // 팽창 //스무스 cvSmooth(pGrayImg,pGrayImg, CV_MEDIAN, 3); cvThreshold( pGrayImg, pGrayImg, 127.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU); cvErode(pGrayImg, pGrayImg, element2, 1); // 침식 // cvSmooth(pGrayImg,pGrayImg, CV_GAUSSIAN, 3); // cvThreshold( pGrayImg, pGrayImg, 127.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU); //반전에 반전 (원본) cvNot(pGrayImg,pGrayImg_inv); cvCvtColor( pGrayImg_inv, pLabeledImg, CV_GRAY2RGB); CBlobLabeling blob; blob.SetParam( pGrayImg, 20 ); blob.DoLabeling(); CvScalar color = cvScalar(255, 0, 0); if((tImage[0][0] = cvLoadImage("ocr_templete/0_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[0][1] = cvLoadImage("ocr_templete/0_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[1][0] = cvLoadImage("ocr_templete/1_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[1][1] = cvLoadImage("ocr_templete/1_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[2][0] = cvLoadImage("ocr_templete/2_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[2][1] = cvLoadImage("ocr_templete/2_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[3][0] = cvLoadImage("ocr_templete/3_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[3][1] = cvLoadImage("ocr_templete/3_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[4][0] = cvLoadImage("ocr_templete/4_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[4][1] = cvLoadImage("ocr_templete/4_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[5][0] = cvLoadImage("ocr_templete/5_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[5][1] = cvLoadImage("ocr_templete/5_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[6][0] = cvLoadImage("ocr_templete/6_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[6][1] = cvLoadImage("ocr_templete/6_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[7][0] = cvLoadImage("ocr_templete/7_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[7][1] = cvLoadImage("ocr_templete/7_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[8][0] = cvLoadImage("ocr_templete/8_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[8][1] = cvLoadImage("ocr_templete/8_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[9][0] = cvLoadImage("ocr_templete/9_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[9][1] = cvLoadImage("ocr_templete/9_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[10][0] = cvLoadImage("ocr_templete/plus_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[10][1] = cvLoadImage("ocr_templete/plus_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[11][0] = cvLoadImage("ocr_templete/minus_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; // if((tImage[11][1] = cvLoadImage("ocr_templete/minus_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ; if((tImage[12][0] = cvLoadImage("ocr_templete/divide_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[12][1] = cvLoadImage("ocr_templete/divide_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[13][0] = cvLoadImage("ocr_templete/pi_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[13][1] = cvLoadImage("ocr_templete/pi_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[14][0] = cvLoadImage("ocr_templete/bracket_l_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[14][1] = cvLoadImage("ocr_templete/bracket_l_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[15][0] = cvLoadImage("ocr_templete/bracket_r_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[15][1] = cvLoadImage("ocr_templete/bracket_r_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[16][0] = cvLoadImage("ocr_templete/A.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[16][1] = cvLoadImage("ocr_templete/A.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[17][0] = cvLoadImage("ocr_templete/L.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[17][1] = cvLoadImage("ocr_templete/L.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[18][0] = cvLoadImage("ocr_templete/t_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[18][1] = cvLoadImage("ocr_templete/t.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[19][0] = cvLoadImage("ocr_templete/i_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[19][1] = cvLoadImage("ocr_templete/I.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[20][0] = cvLoadImage("ocr_templete/c_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[20][1] = cvLoadImage("ocr_templete/C.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[21][0] = cvLoadImage("ocr_templete/s_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[21][1] = cvLoadImage("ocr_templete/S.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[22][0] = cvLoadImage("ocr_templete/o_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[22][1] = cvLoadImage("ocr_templete/O.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[23][0] = cvLoadImage("ocr_templete/dot.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); // if((tImage[23][1] = cvLoadImage("ocr_templete/dot.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[24][0] = cvLoadImage("ocr_templete/m_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[25][0] = cvLoadImage("ocr_templete/n_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[26][0] = cvLoadImage("ocr_templete/d_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[27][0] = cvLoadImage("ocr_templete/e_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[28][0] = cvLoadImage("ocr_templete/f_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[29][0] = cvLoadImage("ocr_templete/dx_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[30][0] = cvLoadImage("ocr_templete/diff_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[31][0] = cvLoadImage("ocr_templete/Large_c_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[32][0] = cvLoadImage("ocr_templete/arrow_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[33][0] = cvLoadImage("ocr_templete/y_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[34][0] = cvLoadImage("ocr_templete/x_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[35][0] = cvLoadImage("ocr_templete/a_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[36][0] = cvLoadImage("ocr_templete/integral_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[37][0] = cvLoadImage("ocr_templete/sigma_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); if((tImage[37][0] = cvLoadImage("ocr_templete/root_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL); for(int i = 0; i < TEMPLATE_NUM; i++) { for(int j = 0; j < TEMPLATE_FONT; j++){ if(tImage[i][j] != NULL){ cvThreshold(tImage[i][j], tImage[i][j], 127.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU); } } } for(int i = 0; i < blob.m_nBlobs; i++) { CvPoint pt1 = cvPoint(blob.m_recBlobs[i].x-5, blob.m_recBlobs[i].y-5); CvPoint pt2 = cvPoint(pt1.x + blob.m_recBlobs[i].width + 10, pt1.y + blob.m_recBlobs[i].height + 10); if((blob.m_recBlobs[i].x-5<= 0)||(blob.m_recBlobs[i].y-5<= 0)){ //size error } else{ //각 레이블 표시 // 이미지 매칭 IplImage* pLabeledImg_obj = cvCreateImage(cvSize(pt2.x-pt1.x, pt2.y-pt1.y), 8, pGrayImg_inv->nChannels); int nMatchValue; double error; /* __android_log_print(ANDROID_LOG_INFO,"pLabeledImg_obj->height:", pLabeledImg_obj->height); __android_log_print(ANDROID_LOG_INFO,"pLabeledImg_obj->width:", pLabeledImg_obj->width); __android_log_print(ANDROID_LOG_INFO,"pt1.x:", pt1.x); __android_log_print(ANDROID_LOG_INFO,"pt1.y:", pt1.y); __android_log_print(ANDROID_LOG_INFO,"pt2.x:", pt2.x); __android_log_print(ANDROID_LOG_INFO,"pt2.y:", pt2.y); __android_log_print(ANDROID_LOG_INFO,"jni","pGrayImg_inv->nChannels:" + 123); __android_log_print(ANDROID_LOG_INFO,"jni","pGrayImg_inv->nChannels:" + 1232); */ cvSetImageROI(pGrayImg_inv,cvRect(pt1.x,pt1.y,pt2.x-pt1.x,pt2.y-pt1.y)); cvCopy(pGrayImg_inv, pLabeledImg_obj); cvResetImageROI(pGrayImg_inv); /* string makeTamplate = "/sdcard/calmera_template/"; //makeTamplate += i; makeTamplate += i; makeTamplate += "_3.jpg"; __android_log_print(ANDROID_LOG_INFO,"jni","saving..."); cvSaveImage(makeTamplate.c_str(), pLabeledImg_obj); __android_log_print(ANDROID_LOG_INFO,"jni","saved!!!"); */ //여기서 위치정보 판별 objCenterPosition[i][0] = (pt2.x-pt1.x)/2 + pt1.x; objCenterPosition[i][1] = (pt2.y-pt1.y)/2 + pt1.y; nMatchValue = matching(pLabeledImg_obj, &error); cvDrawRect(pLabeledImg, pt1, pt2, color); CvFont point_font; cvInitFont(&point_font,CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 8); char text[20]; char letter[5]; if((objCenterPosition[0][1]-objCenterPosition[i][1])>40){ // 자승 처리 formula += "^"; } switch(nMatchValue){ case 0: strcpy(letter, "0"); formula += "0"; break; case 1: strcpy(letter, "1"); formula += "1"; break; case 2: strcpy(letter, "2"); formula += "2"; break; case 3: strcpy(letter, "3"); formula += "3"; break; case 4: strcpy(letter, "4"); formula += "4"; break; case 5: strcpy(letter, "5"); formula += "5"; break; case 6: strcpy(letter, "6"); formula += "6"; break; case 7: strcpy(letter, "7"); formula += "7"; break; case 8: strcpy(letter, "8"); formula += "8"; break; case 9: strcpy(letter, "9"); formula += "9"; break; case 10: strcpy(letter, "+"); formula += "+"; break; case 11: strcpy(letter, "-"); if(((objCenterPosition[i][0] - objCenterPosition[i-1][0])<5)&&((objCenterPosition[i][0] - objCenterPosition[i-1][0])>-5)){ formula.erase(formula.length() -1 ,1 ); formula += "="; } else formula += "-"; break; case 12: strcpy(letter, "/"); formula += "/"; break; case 13: strcpy(letter, "pi"); formula += "pi"; break; case 14: strcpy(letter, "("); formula += "("; break; case 15: strcpy(letter, ")"); formula += ")"; break; case 16: strcpy(letter, "A"); formula += "A"; break; case 17: strcpy(letter, "L"); formula += "L"; break; case 18: strcpy(letter, "t"); formula += "t"; strTemp = formula.substr(formula.length()-1,formula.length()); //if(strTemp == "d") //definedIntEndFlg = 1; definedIntVariable = "t"; break; case 19: strcpy(letter, "I"); formula += "I"; break; case 20: strcpy(letter, "C"); strTemp = formula.substr(formula.length()-2,formula.length()); if((strTemp=="Se")||(strTemp=="SC")){ formula.erase(formula.length() -2 ,2); formula += "sec"; } else formula += "C"; break; case 21: strcpy(letter, "S"); strTemp = formula.substr(formula.length()-2,formula.length()); if((strTemp=="CO")||(strTemp=="C0")||(strTemp=="cO")||(strTemp=="c0")){ formula.erase(formula.length() -2 ,2); formula += "cos"; } else formula += "S"; break; case 22: strcpy(letter, "O"); formula += "O"; break; case 23: strcpy(letter, "."); if(((objCenterPosition[i][0] - objCenterPosition[i-1][0])<10)&&((objCenterPosition[i][0] - objCenterPosition[i-1][0])>-10)){ formula.erase(formula.length() - 2, 2); formula += "i"; } else formula += "."; if(formula.length()>=6){ strTemp = formula.substr(formula.length()-6,formula.length()); if(strTemp == ".^.^.^"){ formula.erase(formula.length() -6 ,6); formula += "integral"; objCenterPosition[0][0] = objCenterPosition[i-1][0]; } } break; case 24: strcpy(letter, "m"); formula += "m"; break; case 25: strcpy(letter, "n"); strTemp = formula.substr(formula.length()-2,formula.length()); if((strTemp=="SI")||(strTemp=="Si")||(strTemp=="sI")||(strTemp=="si")||(strTemp=="S1")||(strTemp=="s1")){ formula.erase(formula.length() -2 ,2); formula += "sin"; } else formula += "n"; break; case 26: strcpy(letter, "d"); formula += "d"; break; case 27: strcpy(letter, "e"); formula += "e"; break; case 28: strcpy(letter, "f"); formula += "f"; break; case 29: strcpy(letter, "dx"); formula += "dx"; //definedIntEndFlg = 1; break; case 30: strcpy(letter, "'"); formula.erase(formula.length() -1 ,1 ); formula += "'"; break; case 31: strcpy(letter, "C"); strTemp = formula.substr(formula.length()-1,formula.length()); if((strTemp=="SC")||(strTemp=="Se")){ formula.erase(formula.length() -2 ,2); formula += "sec"; } else formula += "C"; break; case 32: strcpy(letter, "->"); formula += "->"; break; case 33: strcpy(letter, "y"); formula += "y"; strTemp = formula.substr(formula.length()-1,formula.length()); //if(strTemp == "d") //definedIntEndFlg = 1; definedIntVariable = "y"; break; case 34: strcpy(letter, "x"); formula += "x"; strTemp = formula.substr(formula.length()-1,formula.length()); //if(strTemp == "d") //definedIntEndFlg = 1; definedIntVariable = "x"; break; case 35: strcpy(letter, "a"); formula += "a"; break; case 36: strcpy(letter, "integral"); formula += "integral "; definedIntStartFlg = 1; break; case 37: strcpy(letter, "sigma"); formula += "sigma "; break; case 38: strcpy(letter, "root"); formula += "root "; break; } if(((objCenterPosition[0][1]-objCenterPosition[i][1])>40)&&definedIntStartFlg){ // 정적분 strTemp = formula.substr(formula.length()-10,formula.length()-1); formula.erase(formula.length() - 2, 2); //if(strTemp == "integral ") definedInt[0] = letter; definedIntStartFlg = 0; definedIntEndFlg = 1; }else if(((objCenterPosition[0][1]-objCenterPosition[i][1])<-40)&&definedIntStartFlg){ // 정적분 strTemp = formula.substr(formula.length()-10,formula.length()-1); formula.erase(formula.length() - 1, 1); //if(strTemp == "integral ") definedInt[1] = letter; }else if(definedIntStartFlg){ if(nMatchValue != 36) definedIntStartFlg = 0; definedIntEndFlg = 0; } sprintf(text,"[%s]",letter); pt1.y = pt1.y-5; cvPutText(pLabeledImg,text, pt1, &point_font, CV_RGB(255,0,255)); cvInitFont(&point_font,CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 8); sprintf(text,"[%.1f]",error*100); pt1.y = pt1.y-20; cvPutText(pLabeledImg,text, pt1, &point_font, CV_RGB(0,255,0)); /* cvInitFont(&point_font,CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 8); sprintf(text,"[%d, %d]",objCenterPosition[i][0],objCenterPosition[i][1]); pt1.y = pt1.y-40; cvPutText(pLabeledImg,text, pt1, &point_font, CV_RGB(0,0,255)); */ } //cvWaitKey ( 0 ); } if(definedIntEndFlg){ formula += " from " + definedIntVariable + "=" + definedInt[1] + " to " + definedInt[0]; } outFormula = env->NewStringUTF(formula.c_str()); //env->ReleaseStringUTFChars(outFormula, "hell..."); *pMatGr = pLabeledImg; return outFormula; }