Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
abe16352
O
Opencv
项目概览
Greenplum
/
Opencv
大约 1 年 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
abe16352
编写于
5月 12, 2012
作者:
A
Alexander Smorkalov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ColorBlobDetection example. Bug fix. Refactoring.
上级
ef478840
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
105 addition
and
97 deletion
+105
-97
samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionView.java
...pencv/samples/colorblobdetect/ColorBlobDetectionView.java
+105
-97
未找到文件。
samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionView.java
浏览文件 @
abe16352
package
org.opencv.samples.colorblobdetect
;
import
java.util.ArrayList
;
import
java.util.Iterator
;
import
java.util.List
;
import
org.opencv.android.Utils
;
...
...
@@ -8,9 +9,9 @@ import org.opencv.core.Core;
import
org.opencv.core.CvType
;
import
org.opencv.core.Mat
;
import
org.opencv.core.MatOfPoint
;
import
org.opencv.core.Point
;
import
org.opencv.core.Rect
;
import
org.opencv.core.Scalar
;
import
org.opencv.core.Size
;
import
org.opencv.highgui.Highgui
;
import
org.opencv.highgui.VideoCapture
;
import
org.opencv.imgproc.Imgproc
;
...
...
@@ -26,16 +27,27 @@ import android.view.View.OnTouchListener;
public
class
ColorBlobDetectionView
extends
SampleCvViewBase
implements
OnTouchListener
{
private
Mat
mRgba
;
private
static
final
String
TAG
=
"Example/CollorBlobDetection"
;
public
boolean
mIsColorSelected
=
false
;
public
Scalar
mSelectedColorRgba
=
new
Scalar
(
255
);
public
Scalar
mSelectedColorHsv
=
new
Scalar
(
255
);
public
Scalar
mLowerBound
=
new
Scalar
(
0
);
public
Scalar
mUpperBound
=
new
Scalar
(
0
);
private
final
int
mColorRadius
=
25
;
public
Mat
mSpectrum
=
new
Mat
();
public
int
mSpectrumScale
=
2
;
private
boolean
mIsColorSelected
=
false
;
private
Scalar
mSelectedColorRgba
=
new
Scalar
(
255
);
private
Scalar
mSelectedColorHsv
=
new
Scalar
(
255
);
// Lower and Upper bounds for range checking in HSV color space
private
Scalar
mLowerBound
=
new
Scalar
(
0
);
private
Scalar
mUpperBound
=
new
Scalar
(
0
);
private
Mat
mSpectrum
=
new
Mat
();
private
int
mSpectrumScale
=
4
;
// Color radius for range checking in HSV color space
private
static
final
Scalar
COLOR_RADIUS
=
new
Scalar
(
25
,
50
,
50
,
0
);
// Minimum contour area in percent for contours filtering
private
static
final
double
MIN_CONTOUR_AREA
=
0.1
;
// Logcat tag
private
static
final
String
TAG
=
"Example/CollorBlobDetection"
;
public
ColorBlobDetectionView
(
Context
context
)
{
...
...
@@ -54,110 +66,81 @@ public class ColorBlobDetectionView extends SampleCvViewBase implements OnTouchL
public
boolean
onTouch
(
View
v
,
MotionEvent
event
)
{
// TODO Auto-generated method stub
int
cols
=
mRgba
.
cols
();
int
rows
=
mRgba
.
rows
();
Log
.
d
(
TAG
,
"Resolition: "
+
cols
+
"x"
+
rows
);
int
xoffset
=
(
getWidth
()
-
cols
)
/
2
;
int
yoffset
=
(
getHeight
()
-
rows
)
/
2
;
Log
.
d
(
TAG
,
"Touch offset "
+
xoffset
+
"x"
+
yoffset
);
Log
.
d
(
TAG
,
"Screen touch coordinates: "
+
event
.
getX
()
+
"x"
+
event
.
getY
());
int
xOffset
=
(
getWidth
()
-
cols
)
/
2
;
int
yOffset
=
(
getHeight
()
-
rows
)
/
2
;
int
x
=
(
int
)
event
.
getX
()
-
x
o
ffset
;
int
y
=
(
int
)
event
.
getY
()
-
y
o
ffset
;
int
x
=
(
int
)
event
.
getX
()
-
x
O
ffset
;
int
y
=
(
int
)
event
.
getY
()
-
y
O
ffset
;
Log
.
i
(
TAG
,
"Touch coordinates: ("
+
x
+
", "
+
y
+
")"
);
Log
.
i
(
TAG
,
"Touch
image
coordinates: ("
+
x
+
", "
+
y
+
")"
);
if
((
x
>
cols
)
||
(
y
>
rows
))
return
false
;
if
((
x
<
0
)
||
(
y
<
0
)
||
(
x
>
cols
)
||
(
y
>
rows
))
return
false
;
Rect
TouchedRect
=
new
Rect
();
if
(
x
-
4
>=
0
)
TouchedRect
.
x
=
x
-
4
;
else
TouchedRect
.
x
=
0
;
Rect
touchedRect
=
new
Rect
();
if
(
y
-
4
>=
0
)
TouchedRect
.
y
=
y
-
4
;
else
TouchedRect
.
y
=
0
;
touchedRect
.
x
=
(
x
>
4
)
?
x
-
4
:
0
;
touchedRect
.
y
=
(
y
>
4
)
?
y
-
4
:
0
;
if
(
x
+
4
<
mRgba
.
cols
())
TouchedRect
.
width
=
x
+
4
-
TouchedRect
.
x
;
else
TouchedRect
.
width
=
mRgba
.
width
()
-
TouchedRect
.
x
;
if
(
y
+
4
<
mRgba
.
rows
())
TouchedRect
.
height
=
y
+
4
-
TouchedRect
.
y
;
else
TouchedRect
.
height
=
mRgba
.
rows
()
-
TouchedRect
.
y
;
touchedRect
.
width
=
(
x
+
4
<
mRgba
.
cols
())
?
x
+
4
-
touchedRect
.
x
:
mRgba
.
width
()
-
touchedRect
.
x
;
touchedRect
.
height
=
(
y
+
4
<
mRgba
.
rows
())
?
y
+
4
-
touchedRect
.
y
:
mRgba
.
rows
()
-
touchedRect
.
y
;
Mat
TouchedRegionMat
=
mRgba
.
submat
(
T
ouchedRect
);
Mat
T
ouchedRegionMatHsv
=
new
Mat
();
Mat
touchedRegionMatRgba
=
mRgba
.
submat
(
t
ouchedRect
);
Mat
t
ouchedRegionMatHsv
=
new
Mat
();
Imgproc
.
cvtColor
(
TouchedRegionMat
,
T
ouchedRegionMatHsv
,
Imgproc
.
COLOR_RGB2HSV_FULL
);
Imgproc
.
cvtColor
(
touchedRegionMatRgba
,
t
ouchedRegionMatHsv
,
Imgproc
.
COLOR_RGB2HSV_FULL
);
mSelectedColorHsv
=
Core
.
sumElems
(
T
ouchedRegionMatHsv
);
int
DotCount
=
TouchedRect
.
width
*
T
ouchedRect
.
height
;
mSelectedColorHsv
=
Core
.
sumElems
(
t
ouchedRegionMatHsv
);
int
pointCount
=
touchedRect
.
width
*
t
ouchedRect
.
height
;
for
(
int
i
=
0
;
i
<
mSelectedColorHsv
.
val
.
length
;
i
++)
{
mSelectedColorHsv
.
val
[
i
]
/=
Do
tCount
;
mSelectedColorHsv
.
val
[
i
]
/=
poin
tCount
;
}
Mat
rgbaDotMap
=
new
Mat
();
Mat
hsvDotMat
=
new
Mat
(
1
,
1
,
CvType
.
CV_8UC3
);
Mat
pointMapRgba
=
new
Mat
();
Mat
pointMatHsv
=
new
Mat
(
1
,
1
,
CvType
.
CV_8UC3
);
byte
[]
buf
=
{(
byte
)
mSelectedColorHsv
.
val
[
0
],
(
byte
)
mSelectedColorHsv
.
val
[
1
],
(
byte
)
mSelectedColorHsv
.
val
[
2
]};
hsvDotMat
.
put
(
0
,
0
,
buf
);
Imgproc
.
cvtColor
(
hsvDotMat
,
rgbaDotMap
,
Imgproc
.
COLOR_HSV2RGB_FULL
,
4
);
pointMatHsv
.
put
(
0
,
0
,
buf
);
Imgproc
.
cvtColor
(
pointMatHsv
,
pointMapRgba
,
Imgproc
.
COLOR_HSV2RGB_FULL
,
4
);
mSelectedColorRgba
.
val
=
rgbaDotMap
.
get
(
0
,
0
);
mSelectedColorRgba
.
val
=
pointMapRgba
.
get
(
0
,
0
);
Log
.
i
(
TAG
,
"Touched rgba color: ("
+
mSelectedColorRgba
.
val
[
0
]
+
", "
+
mSelectedColorRgba
.
val
[
1
]
+
", "
+
mSelectedColorRgba
.
val
[
2
]
+
", "
+
mSelectedColorRgba
.
val
[
3
]
+
")"
);
double
MinH
=
0
;
double
MaxH
=
255
;
if
(
mSelectedColorHsv
.
val
[
0
]-
mColorRadius
>=
0
)
MinH
=
mSelectedColorHsv
.
val
[
0
]-
mColorRadius
;
else
MinH
=
0
;
if
(
mSelectedColorHsv
.
val
[
0
]+
mColorRadius
<=
255
)
MaxH
=
mSelectedColorHsv
.
val
[
0
]+
mColorRadius
;
else
MaxH
=
255
;
mLowerBound
.
val
[
0
]
=
MinH
;
mUpperBound
.
val
[
0
]
=
MaxH
;
double
minH
=
(
mSelectedColorHsv
.
val
[
0
]
>=
COLOR_RADIUS
.
val
[
0
])
?
mSelectedColorHsv
.
val
[
0
]-
COLOR_RADIUS
.
val
[
0
]
:
0
;
double
maxH
=
(
mSelectedColorHsv
.
val
[
0
]+
COLOR_RADIUS
.
val
[
0
]
<=
255
)
?
mSelectedColorHsv
.
val
[
0
]+
COLOR_RADIUS
.
val
[
0
]
:
255
;
mLowerBound
.
val
[
0
]
=
minH
;
mUpperBound
.
val
[
0
]
=
maxH
;
mLowerBound
.
val
[
1
]
=
100
;
mUpperBound
.
val
[
1
]
=
255
;
mLowerBound
.
val
[
1
]
=
mSelectedColorHsv
.
val
[
1
]
-
COLOR_RADIUS
.
val
[
1
]
;
mUpperBound
.
val
[
1
]
=
mSelectedColorHsv
.
val
[
1
]
+
COLOR_RADIUS
.
val
[
1
]
;
mLowerBound
.
val
[
2
]
=
100
;
mUpperBound
.
val
[
2
]
=
255
;
mLowerBound
.
val
[
2
]
=
mSelectedColorHsv
.
val
[
2
]
-
COLOR_RADIUS
.
val
[
2
]
;
mUpperBound
.
val
[
2
]
=
mSelectedColorHsv
.
val
[
2
]
+
COLOR_RADIUS
.
val
[
2
]
;
Mat
HsvSpectrum
=
new
Mat
(
32
,
2
*
mColorRadius
*
mSpectrumScale
,
CvType
.
CV_8UC3
);
Log
.
d
(
TAG
,
"Bounds: "
+
mLowerBound
+
"x"
+
mUpperBound
);
Mat
spectrumHsv
=
new
Mat
(
32
,
(
int
)(
maxH
-
minH
)*
mSpectrumScale
,
CvType
.
CV_8UC3
);
for
(
int
i
=
0
;
i
<
32
;
i
++)
{
for
(
int
k
=
0
;
k
<
mSpectrumScale
;
k
++)
{
for
(
int
j
=
0
;
j
<
MaxH
-
M
inH
;
j
++)
for
(
int
j
=
0
;
j
<
maxH
-
m
inH
;
j
++)
{
byte
[]
tmp
=
{(
byte
)(
M
inH
+
j
),
(
byte
)
255
,
(
byte
)
255
};
HsvSpectrum
.
put
(
i
,
j
*
mSpectrumScale
+
k
,
tmp
);
byte
[]
tmp
=
{(
byte
)(
m
inH
+
j
),
(
byte
)
255
,
(
byte
)
255
};
spectrumHsv
.
put
(
i
,
j
*
mSpectrumScale
+
k
,
tmp
);
}
}
}
Imgproc
.
cvtColor
(
HsvSpectrum
,
mSpectrum
,
Imgproc
.
COLOR_HSV2RGB_FULL
,
4
);
Imgproc
.
cvtColor
(
spectrumHsv
,
mSpectrum
,
Imgproc
.
COLOR_HSV2RGB_FULL
,
4
);
mIsColorSelected
=
true
;
...
...
@@ -166,41 +149,66 @@ public class ColorBlobDetectionView extends SampleCvViewBase implements OnTouchL
@Override
protected
Bitmap
processFrame
(
VideoCapture
capture
)
{
// TODO Auto-generated method stub
capture
.
retrieve
(
mRgba
,
Highgui
.
CV_CAP_ANDROID_COLOR_FRAME_RGBA
);
Bitmap
bmp
=
Bitmap
.
createBitmap
(
mRgba
.
cols
(),
mRgba
.
rows
(),
Bitmap
.
Config
.
ARGB_8888
);
if
(
mIsColorSelected
)
{
Mat
BlurMat
=
mRgba
;
//new Mat();
//Imgproc.blur(mRgba, BlurMat, new Size(3, 3));
Mat
PyrDownMat
=
new
Mat
();
Imgproc
.
pyrDown
(
mRgba
,
PyrDownMat
);
Imgproc
.
pyrDown
(
PyrDownMat
,
PyrDownMat
);
Mat
hsvMat
=
new
Mat
();
Imgproc
.
cvtColor
(
BlurMat
,
hsvMat
,
Imgproc
.
COLOR_RGB2HSV_FULL
);
Log
.
d
(
TAG
,
"Bounds: "
+
mLowerBound
+
"x"
+
mUpperBound
);
Imgproc
.
cvtColor
(
PyrDownMat
,
hsvMat
,
Imgproc
.
COLOR_RGB2HSV_FULL
);
Mat
R
angedHsvMat
=
new
Mat
();
Core
.
inRange
(
hsvMat
,
mLowerBound
,
mUpperBound
,
R
angedHsvMat
);
Mat
r
angedHsvMat
=
new
Mat
();
Core
.
inRange
(
hsvMat
,
mLowerBound
,
mUpperBound
,
r
angedHsvMat
);
Mat
DilatedMat
=
new
Mat
();
Imgproc
.
dilate
(
RangedHsvMat
,
DilatedMat
,
new
Mat
());
Mat
CannyRangedMat
=
new
Mat
();
Imgproc
.
Canny
(
RangedHsvMat
,
CannyRangedMat
,
80
,
90
);
Mat
dilatedMat
=
new
Mat
();
Imgproc
.
dilate
(
rangedHsvMat
,
dilatedMat
,
new
Mat
());
List
<
MatOfPoint
>
contours
=
new
ArrayList
<
MatOfPoint
>(
5
);
List
<
MatOfPoint
>
contours
=
new
ArrayList
<
MatOfPoint
>();
Mat
hierarchy
=
new
Mat
();
Imgproc
.
findContours
(
CannyRangedMat
,
contours
,
hierarchy
,
Imgproc
.
RETR_EXTERNAL
,
Imgproc
.
CHAIN_APPROX_SIMPLE
);
Imgproc
.
drawContours
(
mRgba
,
contours
,
-
1
,
new
Scalar
(
255
,
0
,
0
,
255
));
Imgproc
.
findContours
(
dilatedMat
,
contours
,
hierarchy
,
Imgproc
.
RETR_EXTERNAL
,
Imgproc
.
CHAIN_APPROX_SIMPLE
);
// Find max contour area
double
maxArea
=
0
;
Iterator
<
MatOfPoint
>
it
=
contours
.
iterator
();
while
(
it
.
hasNext
())
{
MatOfPoint
wrapper
=
it
.
next
();
double
area
=
Imgproc
.
contourArea
(
wrapper
);
if
(
area
>
maxArea
)
maxArea
=
area
;
}
// Filter contours by area and resize to fit the original image size
List
<
MatOfPoint
>
filteredContours
=
new
ArrayList
<
MatOfPoint
>();
it
=
contours
.
iterator
();
while
(
it
.
hasNext
())
{
MatOfPoint
wrapper
=
it
.
next
();
if
(
Imgproc
.
contourArea
(
wrapper
)
>
MIN_CONTOUR_AREA
*
maxArea
);
Point
[]
contour
=
wrapper
.
toArray
();
for
(
int
i
=
0
;
i
<
contour
.
length
;
i
++)
{
// Original image was pyrDown twice
contour
[
i
].
x
*=
4
;
contour
[
i
].
y
*=
4
;
}
filteredContours
.
add
(
new
MatOfPoint
(
contour
));
}
Imgproc
.
drawContours
(
mRgba
,
filteredContours
,
-
1
,
new
Scalar
(
255
,
0
,
0
,
255
));
Mat
T
estColorMat
=
mRgba
.
submat
(
2
,
34
,
2
,
34
);
T
estColorMat
.
setTo
(
mSelectedColorRgba
);
Mat
t
estColorMat
=
mRgba
.
submat
(
2
,
34
,
2
,
34
);
t
estColorMat
.
setTo
(
mSelectedColorRgba
);
Mat
T
estSpectrumMat
=
mRgba
.
submat
(
2
,
34
,
38
,
38
+
mSpectrum
.
cols
());
mSpectrum
.
copyTo
(
T
estSpectrumMat
);
Mat
t
estSpectrumMat
=
mRgba
.
submat
(
2
,
34
,
38
,
38
+
mSpectrum
.
cols
());
mSpectrum
.
copyTo
(
t
estSpectrumMat
);
}
try
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录