這個系列會開始用Java Open 來進行影像處理的研究,在一開始前,需要寫一個基本的框架類別,提供後續影像處理後的圖檔呈現
把要分析的Lena.jpg 放在resource 資料夾下,或是也可以從這邊下載
宣告一個BasicFrame 類別,在預設無傳參數建構子中呼叫了Imgcodecs.imread()方法,將圖檔轉為Mat 陣列。
setWindow()方法,是讀取影像後,根據影像大小來畫出框架的
public class BasicFrame { public static JFrame frame;
static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}
public static Mat src ;public BasicFrame() { src = Imgcodecs.imread("resource//lena.jpg");}public void setWindow(BufferedImage image,String title) {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 100, image.getWidth()+100
,image.getHeight()+100);
frame.setTitle(title);
frame.getContentPane().setLayout(null);
JLabel label = new JLabel("");
label.setBounds(10,10,image.getHeight(),image.getWidth());
label.setIcon(new ImageIcon(image));
frame.getContentPane().add(label);
}}
接著在main方法中寫一隻程式來測試
public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override
public void run() {
BasicFrame window = new BasicFrame();
BufferedImage image = matToBufferImage(src);
window.setWindow(image, “test”);
window.frame.setVisible(true);
}});}
這邊還會需要用到一個matToBufferImage(src) 方法,主要是將mat 轉為image。其中 int elemSize= (int) matrix.elemSize()用來推算矩陣中每一個元素的數據大小,如果Mat中的數據類型是CV_8U,則elemSize=1,若是CV_8UC3則elemSize=3,若是CV_16UC2則elemSize=4。
這邊還需要一隻將mat 轉為BufferedImage 的方法,如下。
public static BufferedImage matToBufferImage(Mat matrix){ int cols = matrix.cols();
int rows = matrix.rows();
int elemSize= (int) matrix.elemSize();
byte[] data= new byte[cols*rows*elemSize];
int type;
matrix.get(0,0,data);
switch ( matrix.channels()){
case 1: type=BufferedImage.TYPE_BYTE_GRAY;
break; case 3: type =BufferedImage.TYPE_3BYTE_BGR;
byte b;
//bgr to rgb
for (int i=0;i<data.length;i+=3)
{ b = data[i]; data[i]=data[i+2];
data[i+2] = b;
}
break;
default: return null;
}
BufferedImage image2= new BufferedImage(cols,rows,type);
image2.getRaster().setDataElements(0,0,cols,rows,data);
return image2;}
完整程式如下