【发布时间】:2014-11-03 11:08:54
【问题描述】:
我在 OpenCV 的 Java 版本中制作了一个 Mat。现在我需要在窗口中查看它。如何才能做到这一点?我觉得应该很简单。我找到了大量 Python 和 C++ 的示例,但没有直接的 Java 示例。这里有什么帮助吗?
【问题讨论】:
-
这篇文章可能会有所帮助:stackoverflow.com/questions/16494916/…
我在 OpenCV 的 Java 版本中制作了一个 Mat。现在我需要在窗口中查看它。如何才能做到这一点?我觉得应该很简单。我找到了大量 Python 和 C++ 的示例,但没有直接的 Java 示例。这里有什么帮助吗?
【问题讨论】:
我尝试将 python 示例转换为其他答案。我对java的经验有限,所以也许我遗漏了一些东西。话虽如此,我对 opencv 的 java 绑定的状况感到相当失望。我建议你使用 javacv(https://github.com/bytedeco) 而不是 opencv 官方绑定。由于缺少 imshow 和鼠标事件挂钩的绑定,它不如 javacv 可用。
我在下面提供了使用 javacv 对我有用的代码,其行为应该或多或少类似于 python 答案。 notre.jpg 是从您提供的 wiki 链接下载的。我建议如果可能的话,您现在可能想将语言更改为 c++。我感觉 Java 绑定可能存在非常不可接受的错误或严重的可用性问题。
package javaapplication2;
import java.util.ArrayList;
import java.util.List;
import org.bytedeco.javacpp.Pointer;
import static org.bytedeco.javacpp.opencv_calib3d.*;
import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_highgui.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
public class JavaApplication2 {
public static void main(String[] args) throws Exception {
System.loadLibrary("opencv_core249");//without these two lines, I get unsatisfied link exception on my pc. you should unzip the contents of opencv-windows-x86_64.jar etc to a folder and run with -Djava.library.path="C:\opencv\javacv-bin\bin"
System.loadLibrary("jniopencv_core");
Mat im =new Mat(480,640,CV_8UC3);//dummy
Mat dst = null;//new Mat(480,640,CV_8UC1);//dummy
final List<Point> pSrc=new ArrayList<Point>();
final List<Point> pDst=new ArrayList<Point>();
/*640x480 camera
pDst.add(new Point(120,84)); //cam
pDst.add(new Point(525,84));//cam
pDst.add(new Point(525,427));//cam
pDst.add(new Point(120,427));//cam
*/
pDst.add(new Point(94,72));//notre
pDst.add(new Point(343,72));//notre
pDst.add(new Point(343,501));//notre
pDst.add(new Point(94,501));//notre
namedWindow("src",0);
namedWindow("dst",0);
MouseCallback mouseSrc= new MouseCallback() {
@Override
public void call(int event, int x, int y, int flags,Pointer param) {
if(event==CV_EVENT_LBUTTONDOWN)
{
if(pSrc.size()>=4) pSrc.clear();
pSrc.add(new Point(x,y));
}
}
};
setMouseCallback("src", mouseSrc, null);
/* this should work but no..bug?
MouseCallback moustDst= new MouseCallback() {
@Override
public void call(int event, int x, int y, int flags,Pointer param) {
if(event==CV_EVENT_LBUTTONDOWN)
{
if(pDst.size()>=4) pDst.clear();
pDst.add(new Point(x,y));
}
}
};
setMouseCallback("dst", moustDst, null);*/
/* uncomment this one to read from webcam
VideoCapture cap = new VideoCapture(1);
while (cap.read(im)) {*/
im = imread("c:/data/notre.jpg");
while(true){
if(dst==null)
{
dst=im.clone();
}
Mat imD = im.clone();
Mat dstD = dst.clone();
for(int i=0;i<pSrc.size();++i)
{
circle(imD,pSrc.get(i),4,new Scalar(255,0,0,255),-1,1,1);
}
if(pSrc.size()==4 && pDst.size()==4)
{
Mat msrc = new Mat(4,2,CV_64FC1);
Mat mdst = new Mat(4,2,CV_64FC1);
for(int i=0;i<pSrc.size();++i)
{
//this is probably not the right way for element access, but I cant find a more straightforward way
msrc.asCvMat().put(i,0,(double)pSrc.get(i).x());
msrc.asCvMat().put(i,1,(double)pSrc.get(i).y());
}
for(int i=0;i<pDst.size();++i)
{
mdst.asCvMat().put(i,0,(double)pDst.get(i).x());
mdst.asCvMat().put(i,1,(double)pDst.get(i).y());
}
Mat H =findHomography(msrc, mdst );
warpPerspective(imD, dstD, H, new Size(dstD.cols(),dstD.rows()));
}
for(int i=0;i<pDst.size();++i)
{
circle(dstD,pDst.get(i),4,new Scalar(255,255,0,255),-1,1,1);
}
imshow("src",imD);
imshow("dst",dstD);
if(cvWaitKey(1)==27)
break;
}
//cap.release();
}
}
【讨论】: