在MATLAB中利用网络摄像头计算风机转速

7vux5j2d  于 2023-05-07  发布在  Matlab
关注(0)|答案(2)|浏览(316)

我通过检测黄色风扇的中心并在其中一个叶片上放置蓝色信号来进行计算。
然而,当我点击运行,两个“为”的子图不出现在2个单独的数字,第一个“为”的子图出现,然后消失,第二个“为”的子图出现。
也在这里:tetha=tetha+(a2-a1)+2*pi;我不知道是否留下2*pi或删除它。
我有:

clear; clc; close all;
cam = webcam(); % Accede a la cámara web
preview(cam); % Mue
stra la vista previa de la cámara web
centros_azul = zeros(10,2);
centros_circulos = zeros(10,2);
centro_x_prom=0;
centro_y_prom=0;
num_valores=0;
tetha=0;

% Tomar 10 fotografías y guardarlas
disp('Comenzamos')
for i=1:10
    % Capturar imagen
    img = snapshot(cam);
    % Guardar imagen en archivo
    filename = sprintf('imagen_%d.jpg', i); % Define el nombre del archivo
    imwrite(img, filename); % Guarda la imagen en un archivo
    fprintf('Imagen %d guardada.\n', i); % Muestra un mensaje en la consola
    pause(1); % Espera 1 segundo antes de tomar la siguiente imagen
end

  %Acceder a las 10 fotografías

for i=1:10
    figure(1)
    % Leer la imagen del archivo
    filename = sprintf('imagen_%d.jpg', i); % Define el nombre del archivo
    img = imread(filename); % Lee la imagen del archivo
    % Convertir la imagen a formato HSV
    img_hsv = rgb2hsv(img);
    % Definir los rangos de los valores de H, S y V para el color amarillo
    h_min = 0.11; h_max = 0.18;
    s_min = 0.3; s_max = 1.0;
    v_min = 0.7; v_max = 1.0;
    % Detectar el color amarillo en la imagen utilizando máscaras
    h_mask = (img_hsv(:,:,1) >= h_min) & (img_hsv(:,:,1) <= h_max);
    s_mask = (img_hsv(:,:,2) >= s_min) & (img_hsv(:,:,2) <= s_max);
    v_mask = (img_hsv(:,:,3) >= v_min) & (img_hsv(:,:,3) <= v_max);
    yellow_mask = (h_mask & s_mask & v_mask);
% Detección de círculos
rangoRadio = [80 200]; % Rango de radios de los círculos a buscar
sensibilidad = 0.95; % Sensibilidad de la detección de círculos
[centros,radios] = imfindcircles(yellow_mask,rangoRadio,'ObjectPolarity','bright','Sensitivity',sensibilidad); % Detectar círculos
% Mostrar la imagen con el círculo amarillo encerrado en un rectángulo
if ~isempty(centros)
    centro = round(centros(1,:));
    centros_circulos(i,:) = centro;
    radio = round(radios(1));
    img_rect = insertShape(img,'Rectangle',[centro(1)-radio centro(2)-radio radio*2 radio*2],'LineWidth',2,'Color','yellow');
    
    subplot(2,5,i); imshow(img_rect);
    title('Círculo amarillo detectado');
else
    
    subplot(2,5,i); imshow(img);
    title('Círculo amarillo no detectado');
end
disp(centros_circulos);%muestra centros almacenados

end
%promedio de centro de circulo amarillo
for i=1:10
centro_x=centros_circulos(i,1);
centro_y=centros_circulos(i,2);
if centro_x ~= 0 && centro_y ~= 0
centro_x_prom=centro_x+centro_x_prom;
centro_y_prom=centro_y+centro_y_prom;
num_valores=num_valores+1;
end
end

if num_valores > 0
    centro_x_prom = centro_x_prom / num_valores;
    centro_y_prom = centro_y_prom / num_valores;
end

%detección del azul
for i=1:10
    figure(2)
    % Leer la imagen del archivo
    filename = sprintf('imagen_%d.jpg', i); % Define el nombre del archivo
    img = imread(filename); % Lee la imagen del archivo
    
    % Convertir la imagen a formato HSV
    img_hsv = rgb2hsv(img);
    % Definir los rangos de los valores de H, S y V para el color azul
    h_min = 0.50; h_max = 0.61;
    s_min = 0.34; s_max = 1.0;
    v_min = 0.47; v_max = 1.0;
    % Detectar el color azul en la imagen utilizando máscaras
    h_mask = (img_hsv(:,:,1) >= h_min) & (img_hsv(:,:,1) <= h_max);
    s_mask = (img_hsv(:,:,2) >= s_min) & (img_hsv(:,:,2) <= s_max);
    v_mask = (img_hsv(:,:,3) >= v_min) & (img_hsv(:,:,3) <= v_max);
    blue_mask = (h_mask & s_mask & v_mask);
   
    subplot(2,5,i); imshow(blue_mask);
    title(sprintf('Imagen %d', i));
    [height, width]=size(blue_mask);
    contador=0;
    xprom=0;
    yprom=0;
    for y=1:height
        for x=1:width
            if(blue_mask(y,x))
                contador=contador+1;    
                xprom=xprom+x;
                yprom=yprom+y;
            end
        end
    end   
   % [row, col] = find(blue_mask);
    xprom=xprom/contador;
    yprom=yprom/contador;
    centros_azul(i,1)=xprom;
    centros_azul(i,2)=yprom;
    fprintf('Coordenadas del color azul en la imagen %d: (%.2f, %.2f)\n', i, xprom, yprom);
end
%calculo del angulo promedio
for i=1:9
x1=centro_x_prom-centros_azul(i,1);
y1=centro_y_prom-centros_azul(i,2);
x2=centro_x_prom-centros_azul(i+1,1);
y2=centro_y_prom-centros_azul(i+1,2);
a1=atan(y1/x1);
a2=atan(y2/x2);
tetha=tetha+(a2-a1)+2*pi;

end
 tetha_promedio=tetha/9;
 tiempo_total=8.96;
 tiempo_entre_foto=0.9956;
 velocidad_angular_rad=tetha_promedio/tiempo_entre_foto;
 RPM=(velocidad_angular_rad*30)/pi;
 fprintf('RPM = %.2f ', RPM); 
clear cam

给予我的代码,我需要添加到显示子图的2“为”在不同的数字说我,如果我保持+2* 圆周率

hfsqlsce

hfsqlsce1#

对于绘图部分,您有两个选项:
1.使用subplot()和subimage()代替imshow(),如下所示:
int i(i,i); public int findDuplicate();
但由于兼容性,不建议通过文档使用。
1.使用imshow()和tiledlayout()代替subplot(),像这样:
tiledlayout('flow')%如果你事先知道尺寸比flow nexttile imshow(img_rect)nexttile...
有关此问题的文档,请参见此处:enter link description here
对于2pi的问题,您应该详细解释代码的作用以及该行的目标是什么。通过只是快速阅读它,我会说这是有意义的,以保持它,因为刀片偏移它一整轮的起点(2pi),而不是半个(pi)。但没有适当的解释很难分辨

20jt8wwn

20jt8wwn2#

1.-转速范围是多少

普通台式风扇叶片的转速在500至2000 rpm之间。来源here
2.你用的是什么相机?**
人们可以想到的大多数可用相机,至少在第一个示例中,可以在视觉上捕捉这种旋转速度,将嵌入智能手机中,毕竟消费者手持相机市场在几年前崩溃,当时智能手机相机质量超过手持廉价相机。
比如说苹果;像iPhone14(from here)这样的高端智能手机具有以下图像采集规格:

  • 4K视频录制速度24 fps、25 fps、30 fps或60 fps1080 p高清视频录制速度25 fps、30 fps或60 fps720 p高清视频录制速度30 fps电影模式下最高4K HDR速度30 fps动作模式下最高2.8K速度60 fps使用Dolby Vision进行HDR视频录制,最高4K速度60 fps支持1080 p的Slo‑mo视频120 fps或240 fps*
    60 fps表示获取的时间分辨率最高只能达到30 Hz才会出现alias

这意味着,在最快的慢动作模式下,在240 fps的情况下,这个高端设备只能(可能地说)以120 rpm的速度捕捉旋转叶片。

3.-使用激光

使用ArduinoRaspberry Pi板控制激光,记录或真实的向MATLAB提供激光束中断,您有更好的机会正确测量这种旋转速度。
你有Raspberry Pi吗?

4.-高fps相机

另一种解决方案是使用高时间分辨率相机,又名高fps相机。
只要检查一些价格here意识到,最便宜的“运动相机”可能会给予你很多像素,但同样有一个相当低的fps,因为捕捉下坡滑雪或为此事,捕捉任何类型的人类行动,你可能会认为没有必要为4000 fps,当平均客户只会在这样的设备上飞溅高达200美元。
而廉价的运动相机最终可能会滚下来或压在停机坪上:高风险产品规格瞬间拉高设计价格,产品价格:如果降落伞便宜得不像真的,那就把它挡在墙外。

5.-小心在户外瞄准激光

为了以防万一,一件事是要有好奇心,知道你的电脑旁边的台扇是否真的在以预期的转速旋转,另一件事是尝试测量连接到机场或起飞或降落的飞机上的涡轮喷气发动机或螺旋桨风扇的转速。
虽然看起来很明显,但我有一个印象,那就是重要的是要提到将激光瞄准飞行的飞机是非法的。
这就像在美国,即使有隐藏的许可证,也没有理由展示枪,或者在欧洲,普通平民购买泰瑟枪。
实际上
在跑道上**,因为涡轮机已经启动,如果被发现试图测量,这可能是非法的,就像试图用激光束跟踪飞行中的飞机一样,激光束可能会暂时失明飞行员,从而使全机、鸟和任何在下降途中被抓住的人/物处于危险之中。
所以,如果你正在做这些测量工作,请确保你有所有的许可证,经过验证。
如果你只是想知道飞机涡轮机在跑道上旋转的速度,请注意一些飞机配备了基本的电子战接收器:它们知道激光能量何时指向它们。
此外,瞄准激光器开门可能会导致无意识的滋扰,导致站立者部分/暂时/永久失明:行人。骑自行车的人或司机。
希望能帮上忙。

相关问题