场景:
我试图跟踪两个不同的彩色物体.开始时,提示用户将第一个彩色对象(例如,可能是红色)保持在相机前面的特定位置(在屏幕上用矩形标记)并按任意键,然后我的程序获取该部分帧(ROI)并分析其中的颜色,找到要跟踪的颜色.同样对于第二个对象也.然后像往常一样,cv.inRange在HSV颜色平面中使用函数并跟踪对象.
做了什么:
我获取了要跟踪的对象的ROI,将其转换为HSV并检查了Hue直方图.我有两个案例如下:

(这里只有一个主要的中心峰值.但在某些情况下,我得到两个这样的峰值,一个是一个更大的峰值,周围有一些像素簇,第二个峰值,比第一个峰值小,但是周围有小簇的显着大小我现在没有它的样本图像.但它几乎看起来像下面(在油漆中创建))

题 :
How can I get best range of hue values from these histograms?
我的意思是,最好的范围可能是ROI中大约80-90%的像素位于该范围内.
或者有没有比这更好的方法来跟踪不同颜色的物体?
我想问另一个与如何消除Sudoku广场中的凸性缺陷有关的问题?
我在OpenCV-Python中实现了一个Sudoku Solver,它运行得很好.但是在这个时候,我做了一个假设,这将简化我的问题.
假设是: Sudoku boundary(square) is the biggest blob in the input image
例如:
红色块是检测到的方块.您可以看到它涵盖了图像的主要部分.
问题:
问题只不过是假设. If sudoku square has another square around it, method fails. Or if the image has another bigger blob than the sudoku square, again method fails.
例如,拍摄此图像.(我不想在这里上传原始图片,它很大,我也想上传结果)
我尝试了以下几种方法来查找此图像中的数独方块:
1) Find the biggest blob
然后我得到了红色区域.Method Failed.

(图像从原始图像调整大小以减小尺寸)
2) Find only square regions
你可以看到很多候选人都在那里,特别是KING CROSSWORD那些与数独相似的人.Method again fails
In short, this image has everything, to fail …
编辑:更改了标题.我不太感兴趣的是两个部分是相同的,而是,如果它们彼此共线,在一定的容差范围内.如果是这样,那么这些行应该作为单个段聚集在一起.
编辑:我想这是一个简短的说法:我试图以有效的方式将类似的线段聚集在一起.
说我有线段f (fx0, fy0)和(fx1, fy1)和g (gx0, gy0)和(gx1, gy1)
它们来自计算机视觉算法边缘检测器,在某些情况下,两条线基本相同,但由于像素容差而被计为两条不同的线.
有几种情况
f并g分享完全相同的端点,例如:f = (0,0), (10,10) g = (0,0), (10,10)f并g分享大致相同的端点,大致相同的长度,例如:f = (0,0.01), (9.95,10) g = (0,0), (10,10)f是一个子集g,意味着它的端点属于g段并与段具有相同的斜率g.想象一下粗略绘制的线条,其中笔来回移动以使其变厚.例如:f = (4.00, 4.02), (9.01, 9.02) g = (0,0), (10,10)以下不会被视为相同:
f并且g有一个超过一定的斜率差异tolerancef并且g可以具有相同的斜率但是相隔一段距离tolerance,即平行线f并且g在同一平面和相同的斜率上,但根本不重叠...即虚线内的一组段. …我一直在尝试使用PyQt4 GUI和OpenCV捕获视频.我创建了一些按钮,如"开始","结束"等控制捕获.开始很好,但我无法阻止捕获.要停止捕获,我需要在下面的startCapture()函数中打破while循环,我无法实现它.
目前,endCapture()会破坏窗口,但startCapture while循环只是创建它并继续捕获.唯一的选择是打破这个循环.
以下是我使用的代码:
import cv2
import numpy as np
from PyQt4 import QtGui, QtCore
def startCapture(cap):
print "pressed start"
while(True):
ret, frame = cap.read()
cv2.imshow("Capture", frame)
cv2.waitKey(5)
cv2.destroyAllWindows()
def endCapture(cap):
print "pressed End"
cv2.destroyAllWindows()
def quitCapture(cap):
print "pressed Quit"
cv2.destroyAllWindows()
cap.release()
QtCore.QCoreApplication.quit()
class Window(QtGui.QWidget):
def __init__(self):
c = cv2.VideoCapture(0)
QtGui.QWidget.__init__(self)
self.setWindowTitle('Control Panel')
self.start_button = QtGui.QPushButton('Start',self)
self.start_button.clicked.connect(lambda : startCapture(c, True))
self.end_button = QtGui.QPushButton('End',self)
self.end_button.clicked.connect(lambda : endCapture(c))
self.quit_button = QtGui.QPushButton('Quit',self)
self.quit_button.clicked.connect(lambda : quit(c))
vbox …Run Code Online (Sandbox Code Playgroud) 如何在第一张图像中找到红色区域的位置,并使用matlab在灰度图像中标记相同的位置?


我一直在努力了解如何编写缓存友好的代码.因此,作为第一步,我试图了解阵列行主要访问和列主要访问之间的性能差异.
所以我创建了一个512×512大小的int数组,总大小为1MB.我的L1缓存是32KB,L2缓存是256KB,L3缓存是3MB.所以我的阵列适合L3缓存.
我只是按行主要顺序和列主要顺序计算数组元素的总和,并比较它们的速度.一直以来,列主要订单稍快一些.我预计行主要顺序要快于另一个(可能要快几倍).
我认为问题可能是由于阵列的小尺寸,所以我做了另一个大小为8192×8192(256 MB)的数组.结果仍然相同.
以下是我使用的代码段:
#include "time.h"
#include <stdio.h>
#define S 512
#define M S
#define N S
int main() {
// Summing in the row major order
int x = 0;
int iter = 25000;
int i, j;
int k[M][N];
int sum = 0;
clock_t start, end;
start = clock();
while(x < iter) {
for (i = 0; i < M; i++) {
for(j = 0; j < N; j++) {
sum += k[i][j];
}
}
x++;
} …Run Code Online (Sandbox Code Playgroud) 我有一个形状为'A'的形状(50,3)和另一个形状为'B'的形状(1,3).
实际上这个B是A中的一行.所以我需要找到它的行位置.
我用过np.where(A==B),但它给出了元素搜索的位置.例如,下面是我得到的结果:
>>> np.where(A == B)
(array([ 3, 3, 3, 30, 37, 44]), array([0, 1, 2, 1, 2, 0]))
Run Code Online (Sandbox Code Playgroud)
实际上B是A中的第4行(在我的例子中).但是上面的结果给出了(3,0)(3,1)(3,2)和其他,它们是元素相匹配的.
而不是这个,我需要一个答案'3',这是当B在A中作为一个整体搜索时获得的答案,它也删除了其他像(30,1)(37,2)......这些是部分匹配的答案.
我怎么能在Numpy做到这一点?
谢谢.
有人知道python/ruby中的库可以分析图像并提取文本吗?
或者一本关于图像处理的书......
PS:文本采用varius字体和格式,但清晰,Tl; Dr:No captcha或类似.
我一直在学习IA-32汇编编程.所以我想在汇编中编写一个函数并从C++中调用它.
我正在遵循的教程实际上是用于x64程序集.但我正在研究IA-32.在x64中,它表示函数参数存储在RCX,RDX,R8,R9等寄存器中.
但是在搜索一下,我可以理解在IA-32中,参数存储在堆栈中,而不是存储在寄存器中.
下面是我的C++代码:
#include <iostream>
#include <conio.h>
using namespace std;
extern "C" int PassParam(int a,int b);
int main()
{
cout << "z is " << PassParam(15,13) << endl;
_getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
下面是PassParam()函数的汇编代码(它只添加两个参数,这就是全部.它仅用于学习目的):
程序集中的PassParam():
.model C,flat
.code
PassParam proc
mov eax,[ebp-212]
add eax,[ebp-216]
ret
PassParam endp
end
Run Code Online (Sandbox Code Playgroud)
在我的汇编代码中,您可以看到我将[ebp-212]中的第一个参数移动到eax.该值获得如下:
我在C++中编写了PassParam()函数并对其进行了反汇编.然后检查ebp在哪里以及存储第二个参数的位置(参数从右到左存储).我可以看到212的差异,所以这就是我获得这个价值的方式.然后像往常一样,第一个参数存储在4个字节之后.它工作正常.
题 :
这是从程序集访问参数的正确方法吗?我的意思是,它是否始终[ebp-212]存储参数?
如果没有,任何人都可以解释将参数从C++传递到汇编的正确方法吗?
注意 :
我正在使用Windows 7计算机上的Visual C++ 2010.
下面是一个简单的3位计数器.
当复位(rst)为0时,计数器值为"000",否则每个时钟的上升沿递增1.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;
---------------------------------------------
ENTITY counter IS
PORT (clk : IN STD_LOGIC;
rst : in std_logic;
digit : out std_logic_vector (2 downto 0)
);
END counter;
---------------------------------------------
ARCHITECTURE counter OF counter IS
BEGIN
count: PROCESS(clk,rst)
VARIABLE temp : std_logic_vector(2 downto 0);
BEGIN
IF (clk'EVENT AND clk='1') THEN
if (rst = '1') then
temp := temp + "001";
else
temp := "000";
END IF;
END IF;
digit <= temp;
END PROCESS count;
END counter; …Run Code Online (Sandbox Code Playgroud)