0

下一个代码获取我拍摄的葡萄的图像(称为:'full_img')并计算葡萄的面积:

RGB = imread(full_img);
GRAY = rgb2gray(RGB);

threshold = graythresh(GRAY);
originalImage = im2bw(GRAY, threshold);

originalImage = bwareaopen(originalImage,250);
SE = strel('disk',10);
IM2 = imclose(originalImage,SE);
originalImage = IM2;

labeledImage = bwlabel(originalImage, 8);     % Label each blob so we can make measurements of it

blobMeasurements = regionprops(labeledImage, originalImage, 'all');   
numberOfBlobs = length(blobMeasurements);

pixperinch=get(0,'ScreenPixelsPerInch');   %# find resolution of your display
dpix=blobMeasurements(numberOfBlobs).Area; %# calculate distance in pixels 
dinch=dpix/pixperinch;                     %# convert to inches from pixels
dcm=dinch*2.54;                            %# convert to cm from inches
blobArea = dcm;                            % Get area.

如果我用不同的相机在相同的条件下拍摄相同的葡萄(从相同的距离和相同的闪电拍摄),我会得到相同的结果吗?(如果我有一个 5 兆像素和 12 兆像素的相机呢?)。

4

1 回答 1

1

不,不会的。您可以使用 dpix/pixperinch 从图像坐标转到世界坐标。一般来说这是错误的。如果您知道 pixperinch,它仅适用于特定图像(并且仅适用于该图像)。为了得到图像中物体的几何特征(如长度、面积等),必须使用相机矩阵和反投影变换将图像像素点反投影到笛卡尔空间中,才能得到笛卡尔坐标(更不用说校准相机的镜头失真,这是一个非线性问题)。然后,您可以执行计算。即使对于同一台相机,您的代码也不起作用。有关更多信息,请参阅

于 2012-10-22T02:23:09.307 回答