新手学习使用Java,尝试着做一个项目使用Java做一个视频图像的处理。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新手学习使用Java,尝试着做一个项目使用Java做一个视频图像的处理。相关的知识,希望对你有一定的参考价值。

读取视频然后对每帧图像做检测处理,想问Java怎么实现视频的读取和图片的输出?我的Java版本是jdk1.8.0_91,试着用ImageIO时无法引用又该怎么解决,求帮忙?

  Java图像处理技巧四则
下面代码中用到的sourceImage是一个已经存在的Image对象

图像剪切
对于一个已经存在的Image对象,要得到它的一个局部图像,可以使用下面的步骤:

//import java.awt.*;
//import java.awt.image.*;
Image croppedImage;
ImageFilter cropFilter;
CropFilter =new CropImageFilter(25,30,75,75); //四个参数分别为图像起点坐标和宽高,即CropImageFilter(int x,int y,int width,int height),详细情况请参考API
CroppedImage= Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(sourceImage.getSource(),cropFilter));

如果是在Component的子类中使用,可以将上面的Toolkit.getDefaultToolkit().去掉。FilteredImageSource是一个ImageProducer对象。
图像缩放
对于一个已经存在的Image对象,得到它的一个缩放的Image对象可以使用Image的getScaledInstance方法:

Image scaledImage=sourceImage. getScaledInstance(100,100, Image.SCALE_DEFAULT); //得到一个100X100的图像
Image doubledImage=sourceImage. getScaledInstance(sourceImage.getWidth(this)*2,sourceImage.getHeight(this)*2, Image.SCALE_DEFAULT); //得到一个放大两倍的图像,这个程序一般在一个swing的组件中使用,而类Jcomponent实现了图像观察者接口ImageObserver,所有可以使用this。
//其它情况请参考API

灰度变换
下面的程序使用三种方法对一个彩色图像进行灰度变换,变换的效果都不一样。一般而言,灰度变换的算法是将象素的三个颜色分量使用R*0.3+G*0.59+ B*0.11得到灰度值,然后将之赋值给红绿蓝,这样颜色取得的效果就是灰度的。另一种就是取红绿蓝三色中的最大值作为灰度值。java核心包也有一种算法,但是没有看源代码,不知道具体算法是什么样的,效果和上述不同。

/* GrayFilter.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class GrayFilter extends RGBImageFilter
int modelStyle;
public GrayFilter()
modelStyle=GrayModel.CS_MAX;
canFilterIndexColorModel=true;

public GrayFilter(int style)
modelStyle=style;
canFilterIndexColorModel=true;

public void setColorModel(ColorModel cm)
if (modelStyle==GrayModel
else if (modelStyle==GrayModel

public int filterRGB(int x,int y,int pixel)
return pixel;


/* GrayModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class GrayModel extends ColorModel
public static final int CS_MAX=0;
public static final int CS_FLOAT=1;
ColorModel sourceModel;
int modelStyle;

public GrayModel(ColorModel sourceModel)
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;
modelStyle=0;


public GrayModel(ColorModel sourceModel,int style)
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;
modelStyle=style;


public void setGrayStyle(int style)
modelStyle=style;


protected int getGrayLevel(int pixel)
if (modelStyle==CS_MAX)
return Math.max(sourceModel.getRed(pixel),Math.max(sourceModel.getGreen(pixel),sourceModel.getBlue(pixel)));

else if (modelStyle==CS_FLOAT)
return (int)(sourceModel.getRed(pixel)*0.3+sourceModel.getGreen(pixel)*0.59+sourceModel.getBlue(pixel)*0.11);

else
return 0;



public int getAlpha(int pixel)
return sourceModel.getAlpha(pixel);


public int getRed(int pixel)
return getGrayLevel(pixel);


public int getGreen(int pixel)
return getGrayLevel(pixel);


public int getBlue(int pixel)
return getGrayLevel(pixel);


public int getRGB(int pixel)
int gray=getGrayLevel(pixel);
return (getAlpha(pixel)<<24)+(gray<<16)+(gray<<8)+gray;



如果你有自己的算法或者想取得特殊的效果,你可以修改类GrayModel的方法getGrayLevel()。
色彩变换
根据上面的原理,我们也可以实现色彩变换,这样的效果就很多了。下面是一个反转变换的例子:

/* ReverseColorModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class ReverseColorModel extends ColorModel
ColorModel sourceModel;
public ReverseColorModel(ColorModel sourceModel)
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;


public int getAlpha(int pixel)
return sourceModel.getAlpha(pixel);


public int getRed(int pixel)
return ~sourceModel.getRed(pixel);


public int getGreen(int pixel)
return ~sourceModel.getGreen(pixel);


public int getBlue(int pixel)
return ~sourceModel.getBlue(pixel);


public int getRGB(int pixel)
return (getAlpha(pixel)<<24)+(getRed(pixel)<<16)+(getGreen(pixel)<<8)+getBlue(pixel);


/* ReverseColorModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class ReverseFilter extends RGBImageFilter
public ReverseFilter()
canFilterIndexColorModel=true;


public void setColorModel(ColorModel cm)
substituteColorModel(cm,new ReverseColorModel(cm));


public int filterRGB(int x,int y,int pixel)
return pixel;



要想取得自己的效果,需要修改ReverseColorModel.java中的三个方法,getRed、getGreen、getBlue。
下面是上面的效果的一个总的演示程序。

/*GrayImage.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.color.*;
public class GrayImage extends JFrame
Image source,gray,gray3,clip,bigimg;
BufferedImage bimg,gray2;
GrayFilter filter,filter2;
ImageIcon ii;
ImageFilter cropFilter;
int iw,ih;

public GrayImage()
ii=new ImageIcon(\"images/11.gif\");
source=ii.getImage();
iw=source.getWidth(this);
ih=source.getHeight(this);
filter=new GrayFilter();
filter2=new GrayFilter(GrayModel.CS_FLOAT);
gray=createImage(new FilteredImageSource(source.getSource(),filter));
gray3=createImage(new FilteredImageSource(source.getSource(),filter2));
cropFilter=new CropImageFilter(5,5,iw-5,ih-5);
clip=createImage(new FilteredImageSource(source.getSource(),cropFilter));
bigimg=source.getScaledInstance(iw*2,ih*2,Image.SCALE_DEFAULT);
MediaTracker mt=new MediaTracker(this);
mt.addImage(gray,0);
try
mt.waitForAll();
catch (Exception e)
参考技术A 我个人比较喜欢杜老师的教学视频不错,正在B站上看mysql学习数据库这块儿,零基础可以看看他最新版本的Java教程,一共316集。动力节点的java基础教程159集,20年最新升级为全新的java基础316集,可以通过蛙课网获取哦
那是学的不精,天天动脑,可以到学习下,掌握下,补缺补漏,这样就会减轻大脑负担的
参考技术B ffmpeg 必须了,多媒体处理的好选择,建议多看看经典的视频教程,比如java301集。 参考技术C 旧版的杜老师的视频教程是17年的所用的是jdk8。而最新的视频教程是今年的用的是jdk13。而且视频中的知识点都是最新的,你可以去B站上了解一下。动力节点的java基础教程159集,20年最新升级为全新的java基础316集,可以通过蛙课网获取哦
价格都是国家规定的,你可以到了解下,目前优惠很多,你要读,现在去看看呀

Maven学习笔记-使用Eclipse插件创建Java Webapp项目

使用 Java 的猿们,最多接触的大概就是 web 项目了吧?在学习 Maven 的过程中,首先当然就是创建一个 webapp 项目。

自己在尝试的过程中,碰到了很多的问题。我把详细的过程都记录下来,以便今后参考。

 

使用 Maven 的 m2eclipse 插件创建 Java WebApp 工程的步骤:
 
如果未搭建好Maven开发环境,请参考前一篇:Maven学习笔记——环境搭建
 
一、新建工程项目:
 
打开 Eclipse, 菜单栏选择 File -> new -> other,在弹出的对话框中找到 Maven Project.
在弹出的新建 Maven 项目对话框中,不要勾选第一项 “Create a simple project”,如下图所示,点击 Next。
 
 
在列表中找到并选择“maven-archetype-webapp”,点击Next.如下图所示:
 

 

 
填写项目相关信息,Finish。
 

 

建好的工程结构如下图:
 
 
可以看到,web资源文件的目录为 arc/main/webapp
 
第二步:修改JRE版本。
 
项目生成后,JRE 版本默认为1.5 ,我们需要修改成更高版本的。
在项目的 POM.xml 文件中,加入如下配置:
 
  <build>
  <plugins>
  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.1</version>
  <configuration>
  <source>1.7</source>
  <target>1.7</target>
  </configuration>
  </plugin>
  </plugins>
  </build>

(也可以通过修改 settings.xml 全局配置以让 Maven 默认设置特定版本的 JRE,具体方法这里先不写了)

设置完后,选中项目右击,弹出的菜单中选择 Maven->Update Project .↓↓↓
 

 

 
更新之后,发现项目还存在错误。
在项目根目录右击弹出菜单,选择 Build Path ->Configure Buile Path,进入项目的 Java build path 配置页面:
所示错误如下图,提示缺少(missing)两个文件夹。但其实文件夹是存在的。
 

 这时只要将 Libraries 标签中的 JRE System Library 设置为本机默认的就可以解决该错误(不知道为什么会这样)

如下图,查看 Libraries 标签↓↓↓
 
 

 双击 JRE System Library 项,弹出 JRE 设置界面:↓↓↓

 

 

 直接选 Workspace default JRE.
 
完成后,发现项目还有三个报错,如下图所示。别急,我们在接下来的步骤中一个一个解决。
 
 

 

 第三步:添加服务器运行环境(Server Runtime)
 
项目中,index.jsp 显示有错误,错误信息为:
 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
 
这时因为缺少了servlet-api、JSP-API、JSTL等包。
我们不需要一个一个把包导进来,因为 Tomcat 等 Servlet 容器都提供了这个包。在 Eclipse 中对项目设置一下运行环境就可以了。
切换到 Libraries 标签,点击“Add Library”按钮。
 
 

 在弹出的对话框中,选择“Server Runtime”。

 

 选择 Tomcat 服务器。如果这里没有服务器配置,请事先配置一个 Tomcat 等服务器。

(不知道如何配置服务器的话,就用搜索引擎搜一番)。

 

 选中 Tomcat,点击 Finish 后,看到工程已经不再有那两个 Servlet 的报错了。

 
第四步:Project Facet 配置
 
到这一步时,项目应该还有一处错误:
Java compiler level does not match the version of the installed java project facet.
如下图所示:
 

  

我们需要通过修改 Project Facets 来解决这个错误。

打开项目的 Project Facet 置项,如下图,将 Java 的版本设置为 1.7,确定。
如果这时已经时1.7了,则无需修改。
(也不是一定需要1.7,基本上和之前步骤配置的 JRE 版本一致即可)
 
 

 

 现在应该不再报错了。
 
但是我们还需要将 Project Facet 中的 Dynamic web module 的版本设置的更高一些。
如下图所示,我将它设置为3.0版本。
 

 

这时可能会报如下的错误:
 
Cannot change version of project facet Dynamic Web Module to 3.0
 
我在网上找了好多信息,发现所有的解决方法完全没有效果。
但是偶然的,我发现一个简单的方法就能解决这个问题(不知道是通用的还是我自己环境中的特例)。
方法如下:
将 Dynamic Web Module 前的勾取消,点击 Apply。然后再把勾给勾上,发现已经不报错了。
 
第五步:运行
 
设置完毕,运行一下试试:
右击项目 -> Run as -> Run on Server。
 
选择一个服务器:

 

这时项目应该已经配置到服务器中了:

 

 

 点击 Finish,运行成功后打开链接:
http://localhost:8080/hello-maven-web/index.jsp
发现浏览器报404错误。
检查项目的部署配置:
 

 

 发现少了 webapp 这个目录部署路径。
点击“Add”,弹出的对话框中选择“folder”,选中 webapp 文件夹:

 

 

重新运行一次,终于看到 Hello World!
 

 最后,我也不知道为什么,似乎很简单的事情,会变得如此复杂。

以上是关于新手学习使用Java,尝试着做一个项目使用Java做一个视频图像的处理。的主要内容,如果未能解决你的问题,请参考以下文章

开源项目学习指南,血与泪的教训(新手向)

java核心技术

一个完整的新手学习 Java 需要多长时间? [关闭]

适合 JS 新手学习的开源项目——在 GitHub 学编程

Java 新手 - 啥是 JPA 和 DAO? [关闭]

Java新手练习项目毕业设计项目源码下载