- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想检测黑色物体下方的整个区域。
我已经设法像这样得到了黑色物体下方的矩形区域
Point leftPoint = new Point(0,yValueBlack); //far left, black object height
Point rightPoint = new Point(sourceBitmap.getWidth(),sourceBitmap.getHeight()); //btm right of entire bitmap
Rect bottomRect = new Rect(leftPoint,rightPoint);
据此 Rect bottomRect = new Rect(leftPoint,rightPoint);
是我想要检测绿色 strip 的区域,如图所示。这是为了防止应用程序搜索图片上方的任何内容并在其他对象在框架中时导致错误。
我有一个由边界矩形包围的黑色对象的位图,我只想检测 Rect bottomRect = new Rect(leftPoint,rightPoint);
从该位图中绘制绿色 strip 的边界矩形。
我定义垫子尺寸的方式是这样的Mat sourceMat = new Mat(sourceBitmap.getWidth(), sourceBitmap.getHeight(), CvType.CV_8UC3);
然而,当我尝试使用相同的方法来定义我的垫子尺寸以适合黑色对象下方的矩形区域时,如下所示:Mat croppedMat = new Mat(bottomRect, CvType.CV_8UC3);
它会给我一个错误。
这是我认为的样子:
Detect and draw bounding rectangle around black object (Done)
Find rectangle area(RAT) below black object
Detect and draw bounding rectangle around green object within the RAT(I can detect and draw bounding rectangle for green object, cant seem to do it WITHIN the specified RAT)
Display bitmap like shown in image below(done)
编辑:
检测到黑色物体后,边界矩形被绘制,当前位于roiBitmap
上。裁剪 roiBitmap
并尝试在 imageview
中显示它(我会从最终裁剪掉的位图中检测到绿带)给我错误:
CvException [org.opencv.core.CvException: cv::Exception: /build/master_pack-android/opencv/modules/core/src/matrix.cpp:483: error: (-215) 0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows in function cv::Mat::Mat(const cv::Mat&, const cv::Range&, const cv::Range&)
我的代码:
private Bitmap findCombine(Bitmap sourceBitmap) {
Bitmap roiBitmap = null;
Scalar green = new Scalar(0, 255, 0, 255);
Mat sourceMat = new Mat(sourceBitmap.getWidth(), sourceBitmap.getHeight(), CvType.CV_8UC3);
Utils.bitmapToMat(sourceBitmap, sourceMat);
Mat roiTmp = sourceMat.clone();
bitmapWidth = sourceBitmap.getWidth();
Log.e("bitmapWidth", String.valueOf(bitmapWidth));
final Mat hsvMat = new Mat();
sourceMat.copyTo(hsvMat);
// convert mat to HSV format for Core.inRange()
Imgproc.cvtColor(hsvMat, hsvMat, Imgproc.COLOR_RGB2HSV);
Scalar lowerb = new Scalar(85, 50, 40); // lower color border for BLUE
Scalar upperb = new Scalar(135, 255, 255); // upper color border for BLUE
Scalar lowerblack = new Scalar(0, 0, 0); // lower color border for BLACK
Scalar upperblack = new Scalar(180, 255, 40); // upper color border for BLACK
Scalar testRunL = new Scalar(60, 50, 40); // lower Green 83 100 51
Scalar testRunU = new Scalar(90, 255, 255); // upper Green
Core.inRange(hsvMat, lowerblack, upperblack, roiTmp); // select only blue pixels
// find contours
List<MatOfPoint> contours = new ArrayList<>();
List<RotatedRect> boundingRects = new ArrayList<>();
Imgproc.findContours(roiTmp, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
// find appropriate bounding rectangles
for (MatOfPoint contour : contours) {
MatOfPoint2f areaPoints = new MatOfPoint2f(contour.toArray());
RotatedRect boundingRect = Imgproc.minAreaRect(areaPoints);
double rectangleArea = boundingRect.size.area();
// test min ROI area in pixels
if (rectangleArea > 1300 && rectangleArea < 500000) {//400000
Point rotated_rect_points[] = new Point[4];
boundingRect.points(rotated_rect_points);
Rect rect3 = Imgproc.boundingRect(new MatOfPoint(rotated_rect_points));
Log.e("blackArea", String.valueOf(rect3.area()));
// test horizontal ROI orientation
if (rect3.height > rect3.width) {
Imgproc.rectangle(sourceMat, rect3.tl(), rect3.br(), green, 3);
xBlack = rect3.br().x;
yBlack = rect3.br().y;//bottom
battHeight = (rect3.br().y - rect3.tl().y); //batt height in pixel
Log.e("BLACKBR, TL", String.valueOf(rect3.br().y) + "," + String.valueOf(rect3.tl().y));
}
}
}
roiBitmap = Bitmap.createBitmap(sourceMat.cols(), sourceMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(sourceMat, roiBitmap);
Point leftPoint = new Point(0, yBlack); //far left, black object height
Point rightPoint = new Point(roiBitmap.getWidth(), roiBitmap.getHeight()); //btm right of entire bitmap
Rect bottomRect = new Rect(leftPoint, rightPoint);
double rectWidth = sourceBitmap.getWidth() - 0;
double rectHeight = sourceBitmap.getHeight() - yBlack;
Log.e("rectWidth", String.valueOf(rectWidth));
Log.e("rectHeight", String.valueOf(rectHeight));
Size bottomRectSize = new Size(rectHeight, rectWidth);
Bitmap cropBitmap = null;
Bitmap sourceBitmapT = null;
Mat sourceMatT = new Mat(sourceBitmap.getWidth(), sourceBitmap.getHeight(), CvType.CV_8UC3);
Log.e("sourceMatT, BottomRect","SMT "+ String.valueOf(sourceMatT.size()) + " bottomRect " + String.valueOf(bottomRect.size()));
Mat cropMat = new Mat(sourceMatT, bottomRect);
ImageView imgCropped = (ImageView) findViewById(R.id.cropped_image_view);
Utils.bitmapToMat(roiBitmap, sourceMatT);
//mgCropped.setImageBitmap(sourceBitmapT);
Utils.matToBitmap(cropMat, cropBitmap);
imgCropped.setImageBitmap(cropBitmap);
Log.e("sourceMatT, BottomRect","SMT "+ String.valueOf(sourceMatT.size()) + "bottomRect "+ String.valueOf(bottomRect.size()));
返回给我这些值:
sourceMatT, BottomRect: SMT 1920x1080 bottomRect 1080x656
最佳答案
您可以“提取”图像的一部分,然后在整个提取区域中找到轮廓,然后校正找到的轮廓的坐标。类似的东西:
提取部分sourceMat
:
// set top left position and dimensions of extracted area
int topLeftX = ...;
int topLeftY = ...;
int width = ...;
int height = ...;
// create Rect object for extracted area
Rect extractedRect = new Rect (topLeftX, topLeftY, width, height);
// create Mat from sourceMat
Mat extractedMat = new Mat(sourceMat, extractedRect);
在整个提取区域上查找轮廓/矩形或其他东西:
List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(extractedMat, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
建立轮廓的正确坐标(添加到它的X
和Y
坐标,相应的,topLeftX
和topLeftY
正确放置在 sourceMat
上):
List<Rect> rectsOnSourcemat = new ArrayList<>();
for (MatOfPoint contour : contours) {
MatOfPoint2f contourPoints = new MatOfPoint2f(contour.toArray());
RotatedRect boundingRect = Imgproc.minAreaRect(areaPoints);
Point rotated_rect_points[] = new Point[4];
boundingRect.points(rotated_rect_points);
// correct coords here for sourceMat:
for (int ixPoint = 0; ixPoint < 4; ixPoint++) {
rotated_rect_points[ixPoint].x += topLeftX;
rotated_rect_points[ixPoint].y += topLeftY;
}
// crate bounding rect for sourceMat
Rect rect = Imgproc.boundingRect(new MatOfPoint(rotated_rect_points));
rectsOnSourcemat.add(rect);
}
现在在 rectsOnSourcemat
变量中,您将获得建立在提取区域对象上的矩形列表,但已经有了 sourceMat
的坐标。
关于java - OpenCV,安卓 : color detection from particular area or portion of an image?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45706489/
如何将以下行分成 3 组,其中“美元”总和为 10。所有行都必须使用,且不得超过一次。 row|dollars 1|1 2|1 3|1 4|1 5|1 6|1 7|3 8|4 9|7 10|10 一个
我试图使用 JSoup 和 Java 来获取满足我的条件的特定标记后的定义列表(或任何标记)的内容。作为示例,我们假设我们有一个 html 文档,如下所示。 PageID: 2816; NS: 0;
我想编写一个应用程序来识别当前的变更集并标记它们。 我知道我们可以通过使用 hg identify 来获取变更集. 获得变更集后,有没有办法标记它? 谢谢 最佳答案 来自 documentation
当在一个元素上触发多个动画时,我如何监听特定的 animationend。在我的例子中,我设计了一个覆盖歌曲列表(包含 li's,当悬停在上面时会触发动画),当单击列表图标时会弹出。然而,问题不在于菜
我目前正在使用来自支持库 (https://developer.android.com/tools/support-library/features.html#v7-palette) 的 Palett
我已将TinyMCE设置为可与“管理”面板一起使用(按照Django Docs http://code.djangoproject.com/wiki/AddWYSIWYGEditor中的说明进行操作)
我通过调用 API 获得响应。就像这样。 [{"id":213132},{"id":241132},{"id":465413},{"id":546351},{"id":164854,"data":[{
我的 makefile 包含这些片段(以及其他片段): SRC = src OBJ = obj DEPS = $(wildcard $(SRC)/*.cpp) # ... all : $(BINARI
当另一个元素包含特定 ID 时,我试图获取一个 jQuery 条件来将类应用于该特定元素。这是我到目前为止所拥有的: $(document).ready(function() { if( $('.c
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 7 年前。 我想要这样的值 -1,1.02,1.04,1.06,1.08 等...所以在
我正在为寻呼机使用 fragmentpageadapter,我想用新的一组值重新加载特定的 fragment 。 NotifyDataSetcanged 正在重新加载所有 fragment ,我也在使
我有一个名为“checkInGuestUsers”的表,其中有“checkInTime(DATETIME)、checkOutTime(DATETIME)、rooms(varchar)”等列 有特定用户
我正在使用 JMeter 进行负载测试我面临以下问题: 我有一个视频制作网站要测试,我想点击由多个用户创建和播放视频按钮。 最佳答案 本教程介绍了很多用户如何在jmeter中播放 Action ,必须
假设我有以下列表,其中只有字符串。 appliances = ['blender', 'microwave', 'oven', 'toaster'] 如何生成一个由列表组件的元素组成的新列表,该列表仅
我有一个字符串 (Python 2.7.3),它在 Django 中呈现为模板,但我认为这不是 Django 特有的。该字符串来自 docx 文件中的 document.xml 文件。我正在提取呈现它
我正在尝试抓取网站的特定部分 ( https://flightmath.com/from-CDG-to-BLR ),但我无法定位到我需要的元素。 下面是html部分 flight dis
我正在使用 Ubuntu 12。我试图在我的 Ubuntu 机器主目录中搜索单词“SymbolSetThree”。 为此我使用了 grep "SymbolSetThree" /home 简单的显示为
我如何才能获得特定“place_id”的所有图片?。当我检索特定位置的“位置”列表时,我只能访问一个特定的图像“PHOTO_REFERENCE”。。我想通过它的“Places_id”(更具体的搜索)来
我有一个 Student 表,其中包含如下列: | email (PK) | name | 我有一个书 table ,里面有这样的列: | bookid(PK) | title | 我有一个复制表,上
在serverless.yml中,部署配置文件是这样设置的 custom: defaultStage: dev profiles: dev: b***2_dev prod: b***2_pro
我是一名优秀的程序员,十分优秀!