java vc_javacv实战篇

import staticorg.bytedeco.javacpp.opencv_core.CV_8UC1;import staticorg.bytedeco.javacpp.opencv_core.IPL_DEPTH_8U;import staticorg.bytedeco.javacpp.opencv_core.cvCreateImage;import staticorg.bytedeco.javacpp.opencv_core.cvCreateMat;import staticorg.bytedeco.javacpp.opencv_core.cvFlip;import staticorg.bytedeco.javacpp.opencv_core.cvGetSize;import staticorg.bytedeco.javacpp.opencv_core.cvNot;import staticorg.bytedeco.javacpp.opencv_core.cvPoint;import staticorg.bytedeco.javacpp.opencv_core.cvReleaseImage;import staticorg.bytedeco.javacpp.opencv_core.cvScalar;import staticorg.bytedeco.javacpp.opencv_core.cvSetZero;import staticorg.bytedeco.javacpp.opencv_core.cvSize;import staticorg.bytedeco.javacpp.opencv_core.cvSum;import staticorg.bytedeco.javacpp.opencv_core.cvTranspose;import staticorg.bytedeco.javacpp.opencv_imgcodecs.cvLoadImage;import staticorg.bytedeco.javacpp.opencv_imgproc.CV_BGR2GRAY;import staticorg.bytedeco.javacpp.opencv_imgproc.CV_THRESH_BINARY;import staticorg.bytedeco.javacpp.opencv_imgproc.cvCvtColor;import staticorg.bytedeco.javacpp.opencv_imgproc.cvDilate;import staticorg.bytedeco.javacpp.opencv_imgproc.cvErode;import staticorg.bytedeco.javacpp.opencv_imgproc.cvRectangle;import staticorg.bytedeco.javacpp.opencv_imgproc.cvThreshold;importorg.bytedeco.javacpp.opencv_core.CvMat;importorg.bytedeco.javacpp.opencv_core.CvPoint;importorg.bytedeco.javacpp.opencv_core.CvScalar;importorg.bytedeco.javacpp.opencv_core.IplImage;importorg.bytedeco.javacv.Blobs;importorg.bytedeco.javacv.CanvasFrame;importorg.bytedeco.javacv.OpenCVFrameConverter;public classtryy {public static voidmain(String[] args) {

System.out.println("STARTING...\n");

demo();

System.out.println("ALL DONE");

}public static voiddemo()

{int MinArea = 6;int ErodeCount =0;int DilateCount = 0;

IplImage RawImage= null;//Read an image.

for(int k = 0; k < 7; k++)

{if(k == 0) { RawImage = cvLoadImage("BlackBalls.jpg"); MinArea = 250; ErodeCount = 0; DilateCount = 1; }else if(k == 1) { RawImage = cvLoadImage("Shapes1.jpg"); MinArea = 6; ErodeCount = 0; DilateCount = 1; }else if(k == 2) { RawImage = cvLoadImage("Shapes2.jpg"); MinArea = 250; ErodeCount = 0; DilateCount = 1; }else if(k == 3) { RawImage = cvLoadImage("Blob1.jpg"); MinArea = 2800; ErodeCount = 1; DilateCount = 1; }else if(k == 4) { RawImage = cvLoadImage("Blob2.jpg"); MinArea = 2800; ErodeCount = 1; DilateCount = 1; }else if(k == 5) { RawImage = cvLoadImage("Blob3.jpg"); MinArea = 2800; ErodeCount = 1; DilateCount = 1; }else if(k == 6) { RawImage = cvLoadImage("Rice.jpg"); MinArea = 30; ErodeCount = 2; DilateCount = 1; }//ShowImage(RawImage, "RawImage", 512);

IplImage GrayImage= cvCreateImage(cvGetSize(RawImage), IPL_DEPTH_8U, 1);

cvCvtColor(RawImage, GrayImage, CV_BGR2GRAY);//ShowImage(GrayImage, "GrayImage", 512);

IplImage BWImage= cvCreateImage(cvGetSize(GrayImage), IPL_DEPTH_8U, 1);

cvThreshold(GrayImage, BWImage,127, 255, CV_THRESH_BINARY);//ShowImage(BWImage, "BWImage");

IplImage WorkingImage= cvCreateImage(cvGetSize(BWImage), IPL_DEPTH_8U, 1);

cvErode(BWImage, WorkingImage,null, ErodeCount);

cvDilate(WorkingImage, WorkingImage,null, DilateCount);//ShowImage(WorkingImage, "WorkingImage", 512);//cvSaveImage("Working.jpg", WorkingImage);//PrintGrayImage(WorkingImage, "WorkingImage");//BinaryHistogram(WorkingImage);

Blobs Regions= newBlobs();

Regions.BlobAnalysis(

WorkingImage,//image

-1, -1, //ROI start col, row

-1, -1, //ROI cols, rows

1, //border (0 = black; 1 = white)

MinArea); //minarea

Regions.PrintRegionData();for(int i = 1; i <= Blobs.MaxLabel; i++)

{double [] Region =Blobs.RegionData[i];int Parent = (int) Region[Blobs.BLOBPARENT];int Color = (int) Region[Blobs.BLOBCOLOR];int MinX = (int) Region[Blobs.BLOBMINX];int MaxX = (int) Region[Blobs.BLOBMAXX];int MinY = (int) Region[Blobs.BLOBMINY];int MaxY = (int) Region[Blobs.BLOBMAXY];

Highlight(RawImage, MinX, MinY, MaxX, MaxY,1);

}

ShowImage(RawImage,"RawImage", 256);//最后一个参数图片展示大小的。

cvReleaseImage(GrayImage); GrayImage= null;

cvReleaseImage(BWImage); BWImage= null;

cvReleaseImage(WorkingImage); WorkingImage= null;

}

cvReleaseImage(RawImage); RawImage= null;

}//Versions with 2, 3, and 4 parms respectively

public static voidShowImage(IplImage image, String caption)

{

CvMat mat=image.asCvMat();int width = mat.cols(); if(width < 1) width = 1;int height = mat.rows(); if(height < 1) height = 1;double aspect = 1.0 * width /height;if(height < 128) { height = 128; width = (int) ( height *aspect ); }if(width < 128) width = 128;

height= (int) ( width /aspect );

ShowImage(image, caption, width, height);

}public static void ShowImage(IplImage image, String caption, intsize)

{if(size < 128) size = 128;

CvMat mat=image.asCvMat();int width = mat.cols(); if(width < 1) width = 1;int height = mat.rows(); if(height < 1) height = 1;double aspect = 1.0 * width /height;if(height != size) { height = size; width = (int) ( height *aspect ); }if(width != size) width =size;

height= (int) ( width /aspect );

ShowImage(image, caption, width, height);

}public static void ShowImage(IplImage image, String caption, int width, intheight)

{

CanvasFrame canvas= new CanvasFrame(caption, 1); //gamma=1

canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);

canvas.setCanvasSize(width, height);

OpenCVFrameConverter converter= newOpenCVFrameConverter.ToIplImage();

canvas.showImage(converter.convert(image));

}public static void Highlight(IplImage image, int[] inVec)

{

Highlight(image, inVec[0], inVec[1], inVec[2], inVec[3], 1);

}public static void Highlight(IplImage image, int [] inVec, intThick)

{

Highlight(image, inVec[0], inVec[1], inVec[2], inVec[3], Thick);

}public static void Highlight(IplImage image, int xMin, int yMin, int xMax, intyMax)

{

Highlight(image, xMin, yMin, xMax, yMax,1);

}public static void Highlight(IplImage image, int xMin, int yMin, int xMax, int yMax, intThick)

{

CvPoint pt1=cvPoint(xMin,yMin);

CvPoint pt2=cvPoint(xMax,yMax);

CvScalar color= cvScalar(255,0,0,0); //blue [green] [red]

cvRectangle(image, pt1, pt2, color, Thick, 4, 0);

}public static voidPrintGrayImage(IplImage image, String caption)

{int size = 512; //impractical to print anything larger

CvMat mat =image.asCvMat();int cols = mat.cols(); if(cols < 1) cols = 1;int rows = mat.rows(); if(rows < 1) rows = 1;double aspect = 1.0 * cols /rows;if(rows > size) { rows = size; cols = (int) ( rows *aspect ); }if(cols > size) cols =size;

rows= (int) ( cols /aspect );

PrintGrayImage(image, caption,0, cols, 0, rows);

}public static void PrintGrayImage(IplImage image, String caption, int MinX, int MaxX, int MinY, intMaxY)

{int size = 512; //impractical to print anything larger

CvMat mat =image.asCvMat();int cols = mat.cols(); if(cols < 1) cols = 1;int rows = mat.rows(); if(rows < 1) rows = 1;if(MinX < 0) MinX = 0; if(MinX > cols) MinX =cols;if(MaxX < 0) MaxX = 0; if(MaxX > cols) MaxX =cols;if(MinY < 0) MinY = 0; if(MinY > rows) MinY =rows;if(MaxY < 0) MaxY = 0; if(MaxY > rows) MaxY =rows;

System.out.println("\n" +caption);

System.out.print(" +");for(int icol = MinX; icol < MaxX; icol++) System.out.print("-");

System.out.println("+");for(int irow = MinY; irow < MaxY; irow++)

{if(irow<10) System.out.print(" ");if(irow<100) System.out.print(" ");

System.out.print(irow);

System.out.print("|");for(int icol = MinX; icol < MaxX; icol++)

{int val = (int) mat.get(irow,icol);

String C= " ";if(val == 0) C = "*";

System.out.print(C);

}

System.out.println("|");

}

System.out.print(" +");for(int icol = MinX; icol < MaxX; icol++) System.out.print("-");

System.out.println("+");

}public static voidPrintImageProperties(IplImage image)

{

CvMat mat=image.asCvMat();int cols =mat.cols();int rows =mat.rows();int depth =mat.depth();

System.out.println("ImageProperties for " + image + " : cols=" + cols + " rows=" + rows + " depth=" +depth);

}public static floatBinaryHistogram(IplImage image)

{

CvScalar Sum=cvSum(image);float WhitePixels = (float) ( Sum.getVal(0) / 255);

CvMat mat=image.asCvMat();float TotalPixels = mat.cols() *mat.rows();//float BlackPixels = TotalPixels - WhitePixels;

return WhitePixels /TotalPixels;

}//Counterclockwise small angle rotation by skewing - Does not stretch border pixels

public static IplImage SkewGrayImage(IplImage Src, double angle) //angle is in radians

{//double radians = - Math.PI * angle / 360.0;//Half because skew is horizontal and vertical

double sin = -Math.sin(angle);double AbsSin =Math.abs(sin);int nChannels =Src.nChannels();if(nChannels != 1)

{

System.out.println("ERROR: SkewGrayImage: Require 1 channel: nChannels=" +nChannels);

System.exit(1);

}

CvMat SrcMat=Src.asCvMat();int SrcCols =SrcMat.cols();int SrcRows =SrcMat.rows();double WidthSkew = AbsSin *SrcRows;double HeightSkew = AbsSin *SrcCols;int DstCols = (int) ( SrcCols +WidthSkew );int DstRows = (int) ( SrcRows +HeightSkew );

CvMat DstMat= cvCreateMat(DstRows, DstCols, CV_8UC1); //Type matches IPL_DEPTH_8U

cvSetZero(DstMat);

cvNot(DstMat, DstMat);for(int irow = 0; irow < DstRows; irow++)

{int dcol = (int) ( WidthSkew * irow /SrcRows );for(int icol = 0; icol < DstCols; icol++)

{int drow = (int) ( HeightSkew - HeightSkew * icol /SrcCols );int jrow = irow -drow;int jcol = icol -dcol;if(jrow < 0 || jcol < 0 || jrow >= SrcRows || jcol >= SrcCols) DstMat.put(irow, icol, 255);else DstMat.put(irow, icol, (int) SrcMat.get(jrow,jcol));

}

}

IplImage Dst= cvCreateImage(cvSize(DstCols, DstRows), IPL_DEPTH_8U, 1);

Dst=DstMat.asIplImage();returnDst;

}public staticIplImage TransposeImage(IplImage SrcImage)

{

CvMat mat=SrcImage.asCvMat();int cols =mat.cols();int rows =mat.rows();

IplImage DstImage= cvCreateImage(cvSize(rows, cols), IPL_DEPTH_8U, 1);

cvTranspose(SrcImage, DstImage);

cvFlip(DstImage,DstImage,1);returnDstImage;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bytedeco FFmpeg是一个开源的Java库,用于与FFmpeg多媒体框架进行交互。它提供了Java语言的原生接口,可以方便地在Java应用程序中使用FFmpeg的功能。 FFmpeg是一个强大的开源多媒体处理工具,可以用于处理各种音频和视频文件。它支持广泛的多媒体格式,包括常见的MP3、MP4、AVI等,以及更加专业的格式如H.264,FLAC等。通过使用Bytedeco FFmpeg库,我们可以在Java程序中直接调用FFmpeg的方法,实现对多媒体文件的编码、解码、转码、剪辑等各种操作。 Bytedeco FFmpeg库的使用相对简单,首先需要引入相关的依赖,然后通过一些简单的代码即可实现对多媒体文件的处理。比如,我们可以通过Bytedeco FFmpeg将一个视频文件转换成其他格式,或者提取其中的音频。此外,还可以通过Bytedeco FFmpeg进行音视频的解码和编码,以及对多媒体文件进行剪辑和合并。 Bytedeco FFmpeg在Java领域的应用非常广泛,特别是在很多涉及音视频处理的项目中。它提供了方便的接口和强大的功能,使得开发者可以轻松地在Java应用中实现各种复杂的音视频处理需求。同时,Bytedeco FFmpeg也为开发者提供了丰富的文档和示例代码,方便学习和使用。 总而言之,Bytedeco FFmpeg是一个强大且易用的Java库,可以实现对多媒体文件的处理,包括转码、剪辑、解码、编码等操作。它在Java开发中的应用非常广泛,为开发者提供了一种便捷的方式来利用FFmpeg的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值