如何在Java OpenCV 3.4.0中实现imshow、imwrite及截图?含版本迁移问题
OpenCV 2.X到3.X Java版本的API迁移避坑指南
很多同学从OpenCV 2.X切换到3.X的Java版本时,总会碰到API找不到或者用法搞错的情况,我来给大家梳理几个关键的迁移要点:
一、别搞错图像显示的API!
在OpenCV 2.X里,我们用HighGui.imshow(windowName, Mat image)来显示图像,但到了3.X,有人误以为要用Imgcodecs.imwrite(windowName, Mat image)替代——这完全是个误区!
Imgcodecs.imwrite()的作用是把图像保存到本地文件,根本不是用来显示图像的,用它自然没法正常弹出图像窗口。如果要在3.X里显示图像,正确的做法还是用HighGui.imshow(),只是要注意包路径是org.opencv.highgui.HighGui。
二、图像读取API的迁移
2.X里的图像读取方法都在Highgui类下,到了3.X统一迁移到Imgcodecs类中,对应关系如下:
- 2.X:
Highgui.imread(fileName, Highgui.CV_LOAD_IMAGE_GRAYSCALE)→ 3.X:Imgcodecs.imread(fileName, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE) - 2.X:
Highgui.imread(fileName)→ 3.X:Imgcodecs.imread(fileName)
三、绘图函数的迁移
2.X里放在Core类下的绘图相关函数,在3.X里全部移到Imgproc类中了:
- 2.X:
Core.circle(...)→ 3.X:Imgproc.circle(...) - 2.X:
Core.line(...)→ 3.X:Imgproc.line(...)
修正后的示例代码
你提供的示例代码里用Imgcodecs.imwrite是保存图像,如果要改成显示图像,代码应该这样写:
package myfirstPackage; import org.opencv.highgui.HighGui; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.core.Core; import org.opencv.core.Mat; public class ShowImage { public static void main(String[] args) { // 加载本地库 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat src = Imgcodecs.imread("lena.jpg", Imgcodecs.IMREAD_COLOR); // 显示图像 HighGui.imshow("显示Lena图像", src); // 等待按键输入,否则窗口会一闪而过 HighGui.waitKey(0); // 销毁所有窗口 HighGui.destroyAllWindows(); } }
内容的提问来源于stack exchange,提问作者CL plane guy
相关产品推荐
相关产品推荐

