您的位置:首页 > 编程语言 > Java开发

OpenCV 图像一维直方图 and Java类中大括号{}作用

2018-03-06 23:06 316 查看
package com.xiuye.opencv;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.opencv.core.Core;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfInt;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

import com.xiuye.imshow.IV;

public class CalcHist {

static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
log("load libary");
}
{// new T()的时候调用,构造函数之前在{}中初始化
log("TEST");
}

public static void main(String[] args) {

Mat src = Highgui.imread("p1.jpg");
IV.imshow("原图", src);

Imgproc.cvtColor(src, src, Imgproc.COLOR_RGB2GRAY);
IV.imshow("灰度图", src);

List<Mat> images = new ArrayList<>();
images.add(src);

MatOfInt channels = new MatOfInt(0);
log("channels := " + channels.dump());
MatOfInt histSize = new MatOfInt(256);
log("histSize := " + histSize.dump());
MatOfFloat ranges = new MatOfFloat(0, 255);
log("ranges := " + ranges.dump());

// hist仅相当于一个矩阵(数组)
Mat hist = Mat.eye(src.rows(), src.cols(), CvType.CV_8UC1);
Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges);
log("hist := " + hist.dump());

MinMaxLocResult r = Core.minMaxLoc(hist);
double maxVal = r.maxVal;
double minVal = r.minVal;
log("maxValue := " + maxVal);
log("minValue := " + minVal);

int size = 256;
int scale = 3;//直方图条形宽度

//		Mat histImg = Mat.zeros(size, size * scale+10/*加大图像宽度*/, CvType.CV_8UC1);
Mat histImg = new Mat(size, size * scale+10/*加大图像宽度*/, CvType.CV_8UC3/*,Scalar.all(255)*/);
int hpt = (int) (0.9*size);
//		Random  randomColor = new Random();//设置随机颜色
// log(hist.get(254, 0)[0]);
for (int i = 0; i < hist.rows(); i++) {

double binValue = hist.get(i, 0)[0];

//因为值太大了,需要缩小,否则图形显示有问题
int val = (int) (binValue/maxVal*hpt);

Point p1 = new Point(i*scale,size);
Point p2 = new Point((i+1)*scale-1/*下标不越界,-1*/,size - val);

//			Core.rectangle(histImg, p1, p2,
//					new Scalar(randomColor.nextInt(size),
//					randomColor.nextInt(size),randomColor.nextInt(size)),
//					Core.FILLED/*设置填充整个矩形*/);
Core.rectangle(histImg, p1, p2,
new Scalar(0xd6,0x9a,0x00),/*B,G,R*/
Core.FILLED/*设置填充整个矩形*/);

}
IV.imshow("直方图", histImg);
IV.waitKey(0);// 必须写上,否则不显示,按"ESC"退出
}

private static <T> void log(T t) {
System.out.println(t);
}

}

load libary
channels := [0]
histSize := [256]
ranges := [0;
255]
hist := [0;
0;
0;
0;
0;
1;
0;
1;
2;
0;
3;
5;
12;
13;
29;
51;
68;
106;
209;
408;
693;
1315;
1814;
2085;
2510;
2932;
3949;
4820;
5660;
5093;
5424;
6302;
7306;
8105;
8078;
8120;
8919;
9726;
10316;
10830;
12325;
13118;
11989;
12328;
11836;
12010;
13279;
15107;
16048;
15832;
14433;
12521;
12097;
13423;
13007;
11357;
10572;
10056;
10865;
11776;
9102;
8007;
7272;
6976;
6791;
5989;
5517;
5426;
5013;
4500;
4562;
4418;
4425;
4071;
4162;
4337;
4718;
5027;
4394;
4579;
5024;
4922;
5336;
5031;
3993;
3715;
4927;
3729;
3113;
2816;
2656;
2640;
2519;
2531;
2514;
2517;
2437;
2504;
2622;
2854;
3116;
3209;
3258;
3168;
3561;
3370;
3308;
2764;
2496;
2509;
2705;
2562;
2651;
2377;
2549;
2546;
2367;
2455;
2503;
2709;
3120;
3499;
3581;
3628;
3478;
3258;
2713;
2584;
2170;
1913;
1638;
1635;
1755;
2071;
2065;
1952;
1944;
1985;
1988;
1913;
2043;
2058;
2014;
2064;
1900;
1834;
2043;
1851;
1925;
2027;
1994;
1912;
1939;
2012;
1824;
1849;
1947;
1926;
1960;
2012;
2110;
1962;
1880;
1627;
1559;
1468;
1383;
1217;
1177;
1182;
1139;
1068;
1026;
888;
906;
856;
825;
736;
788;
891;
848;
775;
611;
406;
354;
313;
307;
272;
237;
227;
243;
219;
212;
207;
216;
196;
198;
189;
179;
181;
187;
171;
181;
164;
175;
170;
161;
191;
132;
178;
140;
151;
166;
110;
131;
129;
125;
111;
121;
127;
113;
121;
139;
120;
122;
118;
106;
126;
111;
115;
134;
133;
133;
116;
98;
107;
83;
76;
73;
66;
56;
76;
75;
79;
89;
89;
79;
92;
110;
105;
96;
127;
121;
172;
182;
0]
maxValue := 16048.0
minValue := 0.0








参考地址:
imshow项目地址

OpenCV官网
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: