做完條形碼居然沒結束。。。。還要求識别顔色,東西倒是簡單,但是還是寫上,同時把拍照的也寫上,都寫好注釋,當給自己留個備份,也希望對有需求的朋友有幫助。
顔色識别:
//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;
}
就這樣吧,比較簡單,用正在聽得歌詞結尾:
沒有新的衣服能讓你愛戀
總有一種天氣會讓我懷念
醒來或者吃飽又是一年
相遇然後分别就在一天