Java+OpenCV开发(二)eclipse加载OpenCV库

因为学习机器视觉的需要,本人比较喜欢用Java,所以想用Java来进行OpenCV开发。查找网上相关信息,感觉杂乱无章,许多问题无法解决,特此给出本人搭建过程。只是爱好者,不是大神,不喜勿喷,欢迎讨论。

工具版本:

1、eclipse 

2、OpenCV 3.41(2.44后开始支持Java,所以选择哪个版本都行。OpenCV希望自行百度下载,因为好像贴的链接不知道为什么,其他博主自己下得好好地,别人就有可能打不开,可能与个人电脑网络有关。我留一个能不能用自己看着办,3.41版本https://sourceforge.net/projects/opencvlibrary/?source=typ_redirect)

3、win10

安装具体过程:

1、百度OpenCV ,进入OpenCV官网,选择版本,点击版本页面,下载所选链接。



没错就是 .exe 文件,下载时间会有点久。下载完后,自己选个地方安装应该没问题吧。

安装完成后


我们需要用的其实就是这个文件夹 OpenCV目录下得build\Java

2、打开eclipse

window > Preferences > Java > User Libraries


点New,然后自己起个名。


不要告诉我起完名字以后 OK不懂得点,那真是有点老实人了。


现在点 Add External JARs ,刚刚我们仅仅只是建了一个Library,现在我们要往这个Library里面加JAR包

会跳出一个框,你选到你安装OpenCV的路径,然后进入build>java ,到这边你自己看一下自己下载的OpenCV版本,例如我是3.41,那么它就是opencv-3.41.jar,反正这边就这么一个jar包,选它准没错。


点打开。


opencv3.4这个library下瞬间多了很多东西,然后选择Native library location:(None),看到没 现在是None,然后点击Edit。


点击External Folder

还是选择到你安装OpenCV的路径。


自己电脑是64位就选x64文件夹,32就是x86。然后点确定,点OK,点Apply And Close,这个要是还要截图的话,那可真强。

到此为止,OpenCV的library已经完成。

现在就是如何将我们建立的User Library加入工程,懂的人就不用看了,直接copy下面的代码看一下能不能运行。

New一个Java Project,然后右击创建的工程,build path > Add Library,这个应该不用我说了吧,添加jar经常用到这个。


选择User Library ,点击Next。


看到没有,我们刚刚添加的Library,打个勾勾,finish一下,便添加进去了。


看到没有,我们之前没有这个library,现在就有了。(这个User Library在平常开发当中经常遇到,如可将spring这种需多jar包引入的框架,你便可以把它做成Library,这样以后每次引用省心省力。)

这个代码是copy一位老哥的,在此谢谢老哥了,因为我忘了是哪一位,所以在此也说声对不住啊。

public class Hello {
public static void main( String[] args )  
   {  
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );  
      Mat mat = Mat.eye( 3, 3, CvType.CV_8UC1 );  
      System.out.println( "mat = " + mat.dump() );  
   }

}


自己创个类,然后把上面那段老哥的测试代码copy进去。选中所有 然后 Ctrl+shift+O,有惊喜。(这个是eclipse开发过程中的快捷键使用,一位老哥贴出来的,挺不错的http://blog.csdn.net/chushoutaizhong/article/details/51997929 )


没错会帮我们自己把所需要的jar包导进来。

自己RUN一下

有个三行三列的矩阵。


到此OK。

也在这特别感谢之前我看过的那些博客的博主。因为有他们无私的奉献精神,所以我才能学会。

附上一个Java+OpenCV的开发文档,一位老哥那看到的http://opencv-java-tutorials.readthedocs.io/en/latest/





发布了5 篇原创文章 · 获赞 0 · 访问量 3450
展开阅读全文

求大神帮忙把代码改成调用opencv的,谢谢。

05-23

# include<iostream> using namespace std; #include <stack>//需要使用堆栈,对堆栈进行操作 #include "conio.h" # include "viLib.h" // 包含头文件 # pragma comment( lib, "viLib.lib" ) // 包含viLib.lib库 # include "viImage.h" // 包含头文件 # pragma comment( lib, "viImage.lib" ) struct SplitArea { unsigned int w; // 分裂块图像的宽度 unsigned int h; // 分裂块图像的高度 unsigned int left; //相对源图像数据的偏移宽度 unsigned int top; // 相对源图像数据的偏移高度 }; void areaSplitCombine(unsigned char *srcImage, // 源图像数据 unsigned int Width, // 源图像的宽度 unsigned int Heigh) // 相对源图像数据的偏移高度 { //初始区域压栈即整幅图片压栈 stack<SplitArea> MyStack; SplitArea splitarea; splitarea.w = Width; splitarea.h = Heigh; splitarea.left = 0; splitarea.top = 0; MyStack.push(splitarea); //原始图像的区域信息栈 while(!MyStack.empty()) { //区域出栈 splitarea = MyStack.top(); MyStack.pop(); int childWidthTemp[3], childHeightTemp[3];//用于存放图像分裂后的四块子图像的宽度和高度 int n, m, l; n = (splitarea.top * Width + splitarea.left); // 该块图像的左上角像素值在数组中的下标 // 把图像分成4块,采用数组分别存储3个宽度值和3个高度值,该段程序可以处理该块图像的宽度或高度值为奇数的情况 childWidthTemp[0] = 0; childWidthTemp[2] = (splitarea.w + 1) / 2; childWidthTemp[1] = splitarea.w - childWidthTemp[2];//图像宽度为偶数的情况下, childWidthTemp[1]和childWidthTemp[2]无差别, //奇数情况下childWidthTemp[2]-childWidthTemp[1]=1 childHeightTemp[0] = 0; childHeightTemp[2] = (splitarea.h + 1) / 2; childHeightTemp[1] = splitarea.h - childHeightTemp[2];//图像宽度为偶数的情况下, childHidthTemp[1]和childHidthTemp[2]无差别, //奇数情况下childHidthTemp[2]-childHidthTemp[1]=1 // 计算每一块图像的属性值(均方差) int Value; int ValueTemp; int i, j;//对分成的四块图像进行操作的循环 for(i = 1; i < 3; i++) { for(j = 1; j < 3; j++) { Value = 0; m = (n + Width * childHeightTemp[i - 1] + childWidthTemp[j - 1]); int x, y; for(x = 0; x < childHeightTemp[i]; x++) { for(y = 0; y < childWidthTemp[j];y++) { l = (m + Width * x + y) ;//每块图像中各个像素点在存储数组中的位置下标 ValueTemp = srcImage[l]; Value = Value+ValueTemp; } }// 灰度值之和 if(childHeightTemp[i] * childWidthTemp[j] == 0)//分裂至最终结束时分裂块的宽度和高度其中有一个位0,那么分裂结束 { continue; } if(childHeightTemp[i] * childWidthTemp[j] == 1)//分裂至单个像素时,将单个像素进行二值化 { l = m; if(srcImage[l] < 125) { srcImage[l]= 0; } else { srcImage[l] = 255; } continue; } // 各块图像的灰度平均值 int ValueS[2][2]; // 用于存储块图像的灰度值 ValueS[i - 1][j - 1] = Value / (childHeightTemp[i] * childWidthTemp[j]); int Value1=0,ValueTemp1; for(x = 0;x < childHeightTemp[i]; x++) { for(y = 0; y< childWidthTemp[j]; y++) { l = (m + Width * x + y) ; ValueTemp1 = srcImage[l]; Value1 = Value1+(ValueTemp1- ValueS[i - 1][j - 1])*(ValueTemp1- ValueS[i - 1][j - 1]); } } // 各块图像的均方差 int ValueS1[2][2]; // 用于存储块图像的均方差 ValueS1[i - 1][j - 1]= Value1 / (childHeightTemp[i] * childWidthTemp[j]); // 对每一块进行判断是否需要分裂 // 分裂原则: 图像的均方差超过某个阈值是需要分裂 if(ValueS1[i - 1][j - 1] > 100) // 均方差大于某个阈值时需要分裂 { SplitArea childarea; childarea.w = childWidthTemp[j]; childarea.h = childHeightTemp[i]; childarea.left = splitarea.left + childWidthTemp[j - 1]; childarea.top = splitarea.top + childHeightTemp[i - 1]; MyStack.push(childarea); } else // 如果不需要分裂, 则进行合并(直接填充该块图像为灰度值的平均值) { for(x = 0; x < childHeightTemp[i]; x++) { for(y = 0; y < childWidthTemp[j]; y++) { l = (m + Width * x + y) ; srcImage[l] =ValueS[i - 1][j - 1]; } } } } } } return; } int main (int argc, char * const argv[]) { int rv; int PixelFormat = 24, Width, Height; unsigned char * pImg; unsigned char * pBin; if ( argc < 2 ) { fprintf( stderr, "Usage: GetContour.exe image\n" ) ; return 0 ; } rv = viGetImageWH( argv[1], Width, Height ) ; if ( rv == 0 ) { printf( "Could not get image. Program exits!\n" ); exit( 0 ); } pImg = new unsigned char [ Width*Height*PixelFormat/8 ]; viReadImageFile( argv[1], pImg, Width, Height, PixelFormat ); pBin = new unsigned char [Width*Height]; viColor24toGray8(pImg, Width, Height,1,pBin); areaSplitCombine( pBin, Width, Height); viNamedWindow( "Image", GUI_WINDOW_AUTOSIZE ); viShowImage( "Image",pBin, Width, Height, 8, 0 ); viWaitKey( 0 ); delete [] pImg; delete [] pBin; viDestroyAllWindows(); return 0; } 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览