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

    xiaoxiao2025-11-10  6

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

    颜色识别:

    //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; } 就这样吧,比较简单,用正在听得歌词结尾:

    没有新的衣服能让你爱恋

    总有一种天气会让我怀念

    醒来或者吃饱又是一年

    相遇然后分别就在一天

    转载请注明原文地址: https://ju.6miu.com/read-1304056.html
    最新回复(0)