做完条形码居然没结束。。。。还要求识别颜色,东西倒是简单,但是还是写上,同时把拍照的也写上,都写好注释,当给自己留个备份,也希望对有需求的朋友有帮助。
颜色识别:
//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;
}
就这样吧,比较简单,用正在听得歌词结尾:
没有新的衣服能让你爱恋
总有一种天气会让我怀念
醒来或者吃饱又是一年
相遇然后分别就在一天