天天看点

javacv 颜色识别&&拍照&&剪裁&&图像旋转

做完条形码居然没结束。。。。还要求识别颜色,东西倒是简单,但是还是写上,同时把拍照的也写上,都写好注释,当给自己留个备份,也希望对有需求的朋友有帮助。

颜色识别:

//static imports
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;
import static com.googlecode.javacv.cpp.opencv_core.cvCreateImage;
import static com.googlecode.javacv.cpp.opencv_core.cvGetSize;
import static com.googlecode.javacv.cpp.opencv_core.cvInRangeS;
import static com.googlecode.javacv.cpp.opencv_core.cvScalar;
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvShowImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvWaitKey;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_BGR2HSV;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_MEDIAN;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_SHAPE_RECT;
import static com.googlecode.javacv.cpp.opencv_imgproc.MORPH_CLOSE;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCreateStructuringElementEx;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCvtColor;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvDilate;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvErode;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvMorphologyEx;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvSmooth;
//non-static imports
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.googlecode.javacv.cpp.opencv_imgproc.IplConvKernel;
import com.googlecode.javacv.cpp.opencv_core.CvScalar;
	public class TT {
	    //hsv绿色范围

		public static CvScalar g_min = cvScalar(35, 43, 46, 0);//BGR-A
		public static CvScalar g_max= cvScalar(77, 255, 220, 0);//BGR-A
	    public static void main(String[] args) {
	        //读入 图片
	        IplImage orgImg = cvLoadImage("D://1.jpg");
	        //rgb->hsv
	    	IplImage hsv = IplImage.create( orgImg.width(), orgImg.height(), orgImg.depth(), orgImg.nChannels() );
	    	cvCvtColor( orgImg, hsv, CV_BGR2HSV );
	        IplImage imgThreshold = cvCreateImage(cvGetSize(orgImg), 8, 1);
	        //阈值化
	        cvInRangeS(hsv, g_min, g_max, imgThreshold);
	        //形态学闭处理
	         IplImage Morphology_result   = IplImage.create(orgImg.width(),orgImg.height(), IPL_DEPTH_8U, 1);
		     IplConvKernel kernelCross = cvCreateStructuringElementEx(21, 21,7,7, CV_SHAPE_RECT, null);
		     cvMorphologyEx(imgThreshold, Morphology_result, Morphology_result, kernelCross, MORPH_CLOSE, 1);
		 
		     //膨胀腐蚀
		     IplImage erosion_dst   = IplImage.create(orgImg.width(),orgImg.height(), IPL_DEPTH_8U, 1);
		     IplImage dilate_dst   = IplImage.create(orgImg.width(),orgImg.height(), IPL_DEPTH_8U, 1);
		     IplConvKernel kernel=cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_RECT,null);
		     cvErode( Morphology_result, erosion_dst, kernel,19);
		     cvDilate( erosion_dst, dilate_dst, kernel,4);
		     
		     //显示图片
	         cvShowImage( "Contours", dilate_dst );
	         cvWaitKey(0);
	    }
	    
	   
	}
           

拍照:

//static imports
import static com.googlecode.javacv.cpp.opencv_core.cvReleaseImage;
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage;

import com.googlecode.javacv.FrameGrabber.Exception;
import com.googlecode.javacv.OpenCVFrameGrabber;
//non-static imports
import com.googlecode.javacv.cpp.opencv_core.IplImage;
	public class TT {
		public static void main(String[] args) {
			OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);  
			IplImage image = null;
	        try {
				grabber.start();
				
				 image = grabber.grab();  
			} catch (Exception e) {
				e.printStackTrace();
			}       
	        while( image != null){    
				if(image!=null){
					//保存图像到D盘
					cvSaveImage("D://savedImage.jpg",image);
					break;
				}
			}
	        //释放资源  
	        cvReleaseImage(image);  
	        //此处我是有困惑的,因为需要中我是要返回值的,加上这句程序似乎就结束了,不会返回值,所以我去掉了这句
	        /*try {
	        	if(grabber!=null)
				grabber.stop();
	        	grabber.release();
			} catch (Exception e) {
				e.printStackTrace();
			}
	          */
		}
		
	}
	    
	   
           

2016/8/16加  图像剪裁:图像剪裁不是自动的那种,手动的,就是要自己写坐标,老师说这样就可以,那就这样吧,写个简单的小函数吧,调用一下就行了,大家自己把导入的类补全

public IplImage cutImg(IplImage inputImage,CvRect rect){
			IplImage outputImage = cvCreateImage(cvSize(inputImage.width(),inputImage.height()),  IPL_DEPTH_8U, inputImage.nChannels());
			IplImage dst = cvCreateImage(cvSize(rect.width(),rect.height()),  IPL_DEPTH_8U, inputImage.nChannels());
			if(rect.width()<=inputImage.width()&&rect.height()<=inputImage.height()&&rect.x()>=0&&rect.y()>=0&&rect.width()>=0&&rect.height()>=0){
				cvSetImageROI(inputImage, rect);
				cvCopy(inputImage, dst);
				return dst;
			}else{
				return inputImage;
			}
		}
           

2016/8/18加   额,又加了了一个图像旋转,不晓得说啥了,并且要求都显示出来不能有缺失,就弄了一个大图,把小图嵌入,也是写了个函数:

public static IplImage rotateImage(IplImage image, float angle,int Multiple) {
		IplImage addedImage = cvCreateImage(cvSize(image.width()*Multiple,image.height()*Multiple), image.depth(),
				image.nChannels());
		CvRect r = new CvRect(image.width(), image.height(), image.width(), image.height());
		
		 cvSetImageROI( addedImage, r);
		 cvCopy(image, addedImage);
		 cvResetImageROI(addedImage);
		 
		IplImage rotatedImage = cvCreateImage(addedImage.cvSize(), addedImage.depth(),
				addedImage.nChannels());
		
		CvPoint2D32f center = new CvPoint2D32f();
		center.x(addedImage.width()/2);
		center.y(addedImage.height()/2);
		CvMat mapMatrix = cvCreateMat(2, 3, CV_32FC1);

		cv2DRotationMatrix(center, angle, 1.0, mapMatrix);
		cvWarpAffine(addedImage, rotatedImage, mapMatrix, CV_INTER_LINEAR
				+ CV_WARP_FILL_OUTLIERS, cvScalarAll(0));

		cvReleaseMat(mapMatrix);
		return rotatedImage;
	}
           

就这样吧,比较简单,用正在听得歌词结尾:

没有新的衣服能让你爱恋

总有一种天气会让我怀念

醒来或者吃饱又是一年

相遇然后分别就在一天

继续阅读