2015-01-03 15 views
6

के साथ ओपनसीवी मैट प्रदर्शित करें मैं जावाएफएक्स के साथ सीधे ओपनसीवी से Mat ऑब्जेक्ट्स प्रदर्शित करना चाहता हूं। मैंने देखा है कि Mat ऑब्जेक्ट को BufferedImage में परिवर्तित करना संभव है। लेकिन जहां तक ​​मुझे पता है कि आप JavaFX के साथ BufferedImage प्रदर्शित नहीं कर सकते हैं, इसलिए एक और रूपांतरण होना होगा।जावाएफएक्स

क्या पर कोई रास्ता है इसे जावाफैक्स द्वारा प्रदर्शित डेटा संरचना में परिवर्तित करें? मान लिया जाये कि आप कैसे 1 करने के लिए पता

Mat >> BufferedImage >> Image >> ImageView 

:

+0

'WritableImage' का उपयोग करके सीधे FX में कनवर्ट करना संभव है। या तो 'Mat' से 'WritableImage' के' पिक्सेलवाइटर 'तक पिक्सेल की प्रतिलिपि बनाकर, या' मट 'द्वारा समर्थित' पिक्सेल रीडर 'को लागू करके, और सीधे' लिखने योग्य 'को तुरंत चालू करने के लिए इसका उपयोग करें। – haraldK

उत्तर

6

मुझे Mat ऑब्जेक्ट को JavaFX Image ऑब्जेक्ट में कनवर्ट करने का सीधा तरीका मिला है।

MatOfByte byteMat = new MatOfByte(); 
Highgui.imencode(".bmp", mat, byteMat); 
return new Image(new ByteArrayInputStream(byteMat.toArray())); 

आप इसे .jpg पर भी एन्कोड कर सकते हैं लेकिन .bmp तेज है।

+0

मेरा ओपनसीवी हाईगुई पुस्तकालय/कक्षा के साथ क्यों नहीं आता है? –

+1

मैंने इसके बजाय "Imgcodecs.imencode" का उपयोग किया और यह –

2

यह करने के लिए मूर्खतापूर्ण रास्ता Mat एक BufferedImage है कि यह एक ImageView अंदर प्रदर्शित किया जा सकता एक Image है कि परिवर्तित करने के लिए, और उसके बाद तो है रूपांतरण, बाकी कुछ ऐसा होगा:

import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 

Image image = SwingFXUtils.toFXImage(bufImage, null); 

ImageView imgView = new ImageView(); 
imgView.setImage(image); 

मैंने कोड का परीक्षण नहीं किया है, लेकिन यह सामान्य विचार है।

2

टॉमटॉम का जवाब बहुत उपयोगी था और समस्या हल हो गई, लेकिन हाईगुई के पास जावा में कोई बाइंडिंग नहीं है।

MatOfByte byteMat = new MatOfByte(); 
Imgcodecs.imencode(".bmp", mat, byteMat); 
return new Image(new ByteArrayInputStream(byteMat.toArray())); 
+0

काम किया आपका उत्तर OpenCV संस्करण 3 का समाधान है। पहले के संस्करण हाईगुई का उपयोग करते हैं। – Roland

+0

आपके परिशुद्धता के लिए धन्यवाद, मैंने अभी अपना जवाब संपादित और सही किया है। – deb0ch

0
एन्कोडिंग और बाइट सरणी आप की जरूरत प्राप्त करने के लिए डिकोडिंग के बजाय

, तो आप सिर्फ एक सरणी और उपयोग की घोषणा कर सकते हैं:

OpenCV 3.0.0 के रूप में, अप करने की तारीख कोड अधिक की तरह है get विधि। यह स्काला कोड है, लेकिन उम्मीद है कि यह सुगम है:

val arr = new Array[Byte](w * h * 3) 
mat.get(0, 0, arr) 
pw.setPixels(0, 0, w, h, PixelFormat.getByteRgbInstance, arr, 0, w * 3) 

इस कोड w और 3 चैनलों द्वारा आकार h की एक छवि के लिए इसी के साथ प्रकार byte[] की सरणी arr की घोषणा की। फिर डेटा को mat ऑब्जेक्ट से सरणी में कॉपी किया गया है, और PixelWriter ऑब्जेक्ट pw से setPixels विधि को पास कर दिया गया है।