- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 iPhone 摄像头检测电视屏幕。我目前的方法是逐个像素比较后续帧并跟踪累积差异。结果是二值图像,如图所示。
对我来说这看起来像一个矩形,但 OpenCV 不这么认为。它的侧面不是完全笔直的,有时甚至会有更多的颜色渗出,使检测变得困难。这是我尝试检测矩形的 OpenCV 代码,因为我对 OpenCV 不是很熟悉,所以它是从我找到的一些示例中复制的。
uint32_t *ptr = (uint32_t*)CVPixelBufferGetBaseAddress(buffer);
cv::Mat image((int)width, (int)height, CV_8UC4, ptr); // unsigned 8-bit values for 4 channels (ARGB)
cv::Mat image2 = [self matFromPixelBuffer:buffer];
std::vector<std::vector<cv::Point>>squares;
// blur will enhance edge detection
cv::Mat blurred(image2);
GaussianBlur(image2, blurred, cvSize(3,3), 0);//change from median blur to gaussian for more accuracy of square detection
cv::Mat gray0(blurred.size(), CV_8U), gray;
std::vector<std::vector<cv::Point> > contours;
// find squares in every color plane of the image
for (int c = 0; c < 3; c++) {
int ch[] = {c, 0};
mixChannels(&blurred, 1, &gray0, 1, ch, 1);
// try several threshold levels
const int threshold_level = 2;
for (int l = 0; l < threshold_level; l++) {
// Use Canny instead of zero threshold level!
// Canny helps to catch squares with gradient shading
if (l == 0) {
Canny(gray0, gray, 10, 20, 3); //
// Dilate helps to remove potential holes between edge segments
dilate(gray, gray, cv::Mat(), cv::Point(-1,-1));
} else {
gray = gray0 >= (l+1) * 255 / threshold_level;
}
// Find contours and store them in a list
findContours(gray, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
// Test contours
std::vector<cv::Point> approx;
int biggestSize = 0;
for (size_t i = 0; i < contours.size(); i++) {
// approximate contour with accuracy proportional
// to the contour perimeter
approxPolyDP(cv::Mat(contours[i]), approx, arcLength(cv::Mat(contours[i]), true)*0.02, true);
if (approx.size() != 4)
continue;
// Note: absolute value of an area is used because
// area may be positive or negative - in accordance with the
// contour orientation
int areaSize = fabs(contourArea(cv::Mat(approx)));
if (approx.size() == 4 && areaSize > biggestSize)
biggestSize = areaSize;
cv::RotatedRect boundingRect = cv::minAreaRect(approx);
float aspectRatio = boundingRect.size.width / boundingRect.size.height;
cv::Rect boundingRect2 = cv::boundingRect(approx);
float aspectRatio2 = (float)boundingRect2.width / (float)boundingRect2.height;
bool convex = isContourConvex(cv::Mat(approx));
if (approx.size() == 4 &&
fabs(contourArea(cv::Mat(approx))) > minArea &&
(aspectRatio >= minAspectRatio && aspectRatio <= maxAspectRatio) &&
isContourConvex(cv::Mat(approx))) {
double maxCosine = 0;
for (int j = 2; j < 5; j++) {
double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
maxCosine = MAXIMUM(maxCosine, cosine);
}
double area = fabs(contourArea(cv::Mat(approx)));
if (maxCosine < 0.3) {
squares.push_back(approx);
}
}
}
}
在 Canny-step 之后图像看起来像这样:
对我来说似乎很好,但由于某种原因未检测到矩形。谁能解释我的参数是否有问题?
我的第二种方法是使用 OpenCV 霍夫线检测,基本上使用与上面相同的代码,对于 Canny 图像,我然后调用 HoughLines 函数。它给了我很多线条,因为我不得不降低阈值来检测垂直线条。结果如下所示:
问题是有很多行。如第一张图片所示,如何找出与蓝色矩形边接触的线?
或者是否有更好的方法来检测屏幕?
最佳答案
关于OpenCV 使用摄像头检测电视屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47175206/
我目前正在开发一个 Android 电视应用程序,但无法弄清楚如何更改当我在播放视频时离开该应用程序时出现的正在播放的卡片的图标。 这link显示我需要使用 uri 格式的字符串设置 MediaMet
[注意:这是对 earlier question 的重写这被认为是不合适的和封闭的。] 我需要对电视 (TV) 视频进行一些像素级分析。这种分析的确切性质并不相关,但它基本上涉及查看电视视频每一帧的每
我长期使用 mumudvb 和一张 dvb-t pci 卡在我的网络上流式传输电视 channel 。这工作正常,但我最近添加了另一个不如其他播放器强大的播放器,所以我想重新编码视频流。 这是我的输入
我正在尝试为 android 电视制作一个应用程序,它将使用电视 Remote 上的以下按钮:up、down、left,向右,居中/输入,home,返回。 我需要参加哪些类(class)/Activi
Paypal Rest Api 不适用于 Tizen tv,但它在 rest 客户端上运行良好。Tizen tv 中既不调用成功函数也不调用失败函数。 更改了 paypal 以外的 url,它的工作正
我想访问以下当前可用推送通知的数量: ,这里是 Android TV 模拟器图像.. 那么我怎样才能读取那个数字呢? 编辑:我不想设置任何东西。 最佳答案 您可以使用 NotificationList
我知道如何在显示键盘时在 android 移动设备中进行检测,但是如何在 android 电视或火电视上做到这一点? 最佳答案 尝试这个 fun isKeyBoardVisible() = ViewC
我有一台 3D 电视,并且觉得如果我不至少尝试让它显示我自己创作的漂亮 3D 图像,我就是在逃避自己的责任(作为极客)! 我之前已经完成了非常基本的 OpenGL 编程,因此我了解所涉及的概念 - 假
我想通过 PC 上的 Java 程序控制我的 DLNA 电视。特别是,我想: 发现局域网中是否有电视 检查它当前是否开启(第一步) 稍后向它发送一些命令(例如关闭) 我相信,我需要实现数字媒体 Con
我看到很多帖子都在展示如何使用 adb connect 连接到 Android 设备但就我而言,它不起作用... unable to connect to :5555: cannot connect
我想从一个 java 程序发送以下命令,但并不过分阅读响应。知道我该怎么做吗 下面的命令通过 CEC 命令打开电视 echo "standby 0000" | cec-client -d 1 -s "
我有一台每天自动启动的独立公共(public)信息亭电脑。它连接到高清电视,有时检测不到。我必须亲自去 PC,转到屏幕分辨率,然后按检测它的工作原理。 我的问题是如何知道我希望它显示的显示器是否已在代
如何在 Erlang/OTP v17 中查看 mnesia 表。我尝试使用 tv:start() 但外壳返回 undefined function。看起来 tv 模块不再存在。用什么来代替它? 最佳答
我目前遇到了 Facebook 实时 API 的问题。 我希望订阅用户个人资料中的一些内容,包括他们在音乐、书籍、电视和电影类别中的“喜欢”。 当我通过 FQL 和 Graph 查询时,我得到了正确的
我是一名优秀的程序员,十分优秀!