我正在开展一个项目,该项目包括使用相机检测电子元件是否已经焊接。程序必须能够在PLC请求时触发快照,对其进行分析并将通过/失败标志发送回plc。
作为一名MATLAB工作人员,我一直在寻找相关信息,以了解它是否可行并了解从哪里开始。
我的想法是计算在定义的区域中有多少像素具有银色或金色调。如果它主要是金,则意味着它没有被焊接。
我的问题是,如何获取网络摄像头图像区域内定义范围内颜色的像素数?
我已经找到了这个,但它是一个确切的颜色而不是一个范围。
count = sum(im(:,:1)== 255& im(:,:3)== 255& im(:,:,3)== 255);
答案 0 :(得分:1)
最后,我使用了我发布的功能但使用了一个感兴趣的小区域。
我需要在黄色区域画一个正方形,有什么建议吗?
我附上代码以便有一些反馈(我不知道如何附加它,也许你不会看到它)。评论是加泰罗尼亚语,但你不会理解我所做的事情。
谢谢大家!
clear all
clc
info = imaqhwinfo('winvideo') %Defineix origen de video
dev=info.DeviceInfo
vid=videoinput('winvideo',1)
vid.ROIPosition=[200 300 355 400]; %Zona a analitzar [iniciX, iniciY, ampladaX,
alçadaY]
vid.FramesPerTrigger=5; %Millora la qualitat de la foto
src.Sharpness=5;
img=getsnapshot(vid); %Dispara foto
count = sum((img(:, :, 1) >= 150 & img(:, :, 1) <= 255) & (img(:, :, 2) >= 100 & img(:,
:, 2) <= 255) & (img(:, :, 3) >= 0 & img(:, :, 3) <= 100));
numP=sum(count(1,:)) %Nombre de píxels en el rang de color donat
%ARA DETECTA GROC/DAURAT
dimT=size(img(:,:,1)); %Nombre de píxels total en la imatge
numT=dimT(1)*dimT(2)
Percentatge=numP/numT*100 %Percentatge de color en la imatge
%Hold on
%Draw square
%imshow(img)
%Hold off
答案 1 :(得分:0)
以下是两种在预定义颜色范围内拾取像素的方法。
_
clear;clc;close all
I_rgb = imread('peppers.png');
figure(1)
imshow(I_rgb)
% hue distance in HSV space
I_hsv = rgb2hsv(I_rgb);
red_h = 358/360; % (normalized) hue for the red color
O_select = abs(I_hsv(:,:,1)-red_h)<=.05;
figure(2)
imshow(O_select)
O_hsv = I_hsv;
O_hsv(:,:,2) = O_hsv(:,:,2).*O_select;
O_rgb = hsv2rgb(O_hsv);
figure(3)
imshow(O_rgb)
% Euclidean distance in RGB space
red_rgb = reshape([188;28;38],[1,1,3]); % rgb coordinates for the red color
O_distance = sqrt(sum(bsxfun(@minus, double(I_rgb), red_rgb).^2, 3));
O_select = O_distance < 50;
figure(4)
imshow(O_select);
O_hsv = I_hsv;
O_hsv(:,:,2) = O_hsv(:,:,2).*O_select;
O_rgb = hsv2rgb(O_hsv);
figure(5)
imshow(O_rgb)
您可以定义多种颜色进行选择,并使用or
之类的内容将多个O_select
组合到最终结果中。
答案 2 :(得分:0)
不需要昂贵的MATLAB,你可以在免费且可用的ImageMagick中轻松完成这项工作here
所以,基本上你使用这个命令:
convert yourpicture.jpg -colorspace rgb -colors 256 -depth 8 txt:
它为您提供了所有像素及其值的列表:
# ImageMagick pixel enumeration: 32,32,255,rgb
0,0: (255,255,0) #FFFF00 rgb(255,255,0)
1,0: (255,255,0) #FFFF00 rgb(255,255,0)
2,0: (255,255,0) #FFFF00 rgb(255,255,0)
然后你可以摆脱所有多余的东西,只需看看这样的RGB值:
convert yourimage.jpg -colorspace rgb -colors 256 -depth 8 txt: | \
awk -F'[()]' '/^[0-9]/{print $4}' | \
awk -F, '{R=$1;G=$2;B=$3; print R,G,B}'
示例输出
0 255 255
0 255 255
8 156 8
8 156 8
0 55 0
0 55 0
0 55 0
8 156 8
以上代码将拍摄您的图像,无论是JPEG还是PNG还是TIFF,并列出所有像素的所有RGB值。
如果我们现在假设黄金是RGB 255,215,0,我们可以这样做:
# Find gold pixels +/- fuzz factor of 25
#
convert yourpicture.jpg -colorspace rgb -colors 256 -depth 8 txt: | \
awk -F'[()]' '/^[0-9]/{print $4}' | \
awk -F, 'BEGIN {gold=0}
{R=$1;G=$2;B=$3; if((R>230) && (G>190) && (G<240) && (B<25))gold++}
END {print "Gold pixels found: ",gold}'
如果你想使用色调/饱和度和值,你可以在ImageMagick中同样这样做:
# Find gold pixels +/- fuzz Hue=14
#
convert yourpicture.jpg -colorspace hsv -depth 8 txt:| \
awk -F'[()]' '/^[0-9]/{print $4}' | \
awk -F, 'BEGIN {gold=0}
{H=$1; if((H>11)&&(H<16))gold++}
END {print "Gold pixels found: ",gold}'
我应该指出Hue的范围是0-360,所以如果我们搜索14(+/-模糊),我们正在寻找360%的14%的色调,即Hue = 50,这对应于黄金。
如果要显示选择和计算的像素,可以执行以下操作:
convert pcb.jpg -channel R -fx "hue>0.09&&hue<0.11?1:0" -separate -background black -channel R -combine pcb_gold.jpg
,给定此输入图像,将产生此结果:
比上述更容易,这个小脚本可以满足您的所有需求!
#!/bin/bash
# Define our gold colour
#
gold="rgb(255,215,0)"
# Convert all pixels in the image that are gold +/-35% into red. Write output to "out.jpg"
# ... and also in text format so we can count the red pixels with "grep -c"
convert pcb.jpg -fuzz 35% -fill red -opaque "$gold" -depth 8 -colorspace rgb -write txt: out.jpg | grep -c FF0000
生成此图像,黄金像素数为1076。