天天看點

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

就這樣吧,比較簡單,用正在聽得歌詞結尾:

沒有新的衣服能讓你愛戀

總有一種天氣會讓我懷念

醒來或者吃飽又是一年

相遇然後分别就在一天

繼續閱讀