如何最好地使用Android手机的相机和OpenCV检测不同的LED颜色?
如何最好地使用Android手机的相机和OpenCV检测不同的LED颜色?
我正在尝试使用OpenCV在安卓手机上识别和区分黑色背景下的LED灯的颜色,但目前遇到了困难。迄今为止,我的调查指出存在两个独立的问题:
- 使用OpenCV时,相机似乎默认为自动白平衡,这使得很难区分某些颜色。使用原生的安卓相机,最好的图像似乎是在设置为"多云"的白平衡下产生的。
- OpenCV提供的图像是在RGB颜色空间中的,然而RGB与人类感知的颜色之间的距离不匹配,这意味着欧几里德的RGB距离度量不是最佳解决方案(参见如何比较两种颜色)。
因此,我有三个问题:
- 在Android Java或OpenCV中是否有一种方法可以设置相机的白平衡,以影响OpenCV返回的结果图像?
- 如果没有,是否有一种可用的算法(最好是Java)来修改OpenCV图像的白平衡?
- 是否有一种可用的算法(同样是Java),可以将RGB颜色转换为更好地匹配人类感知颜色之间距离的另一种颜色空间?
谢谢
如何最好地使用Android手机的摄像头和OpenCV检测不同的LED颜色?
为了从黑色背景中识别不同的LED颜色,我提出以下解决方案:
首先,使用OpenCV的cvtColor函数将RGB转换为HSV颜色空间。在这里,HSV代表色调(如红色、绿色、黄色、蓝色等)、饱和度(颜色的饱和度)和值(亮度)。转换后,每个RGB值都会有一个对应的HSV值。与RGB一样,HSV也有三个通道:H、S和V。
其次,由于你只关心LED的颜色,请仅分析色调分量来确定LED的颜色。例如,你可以对色调通道进行阈值处理,确定图像中哪部分的色调位于10到25之间等等...绘制/打印阈值图像以检查你的代码。
以下是具体的代码实现:
# Import the necessary libraries import cv2 # Load the image with the LED colors image = cv2.imread("led_colors.jpg") # Convert the image from RGB to HSV hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # Extract the hue channel from the HSV image hue_channel = hsv_image[:, :, 0] # Threshold the hue channel to detect specific LED colors lower_threshold = 10 upper_threshold = 25 thresholded_image = cv2.inRange(hue_channel, lower_threshold, upper_threshold) # Display the thresholded image cv2.imshow("Thresholded Image", thresholded_image) cv2.waitKey(0) cv2.destroyAllWindows()
以上代码将加载包含LED颜色的图像,并将其从RGB转换为HSV颜色空间。然后,从HSV图像中提取色调通道,并对色调通道进行阈值处理,以检测特定的LED颜色。最后,显示阈值图像。
你可以根据需要调整阈值范围,并根据绘制/打印的阈值图像来验证你的代码。
希望对你有所帮助!
问题的出现原因:
提问者想要通过Android手机的摄像头和OpenCV来检测LED灯的不同颜色。提问者已经找到了一些相关的代码和方法,但仍然需要解决一些问题,例如如何设置白平衡和如何检测LED灯的不同颜色。
解决方法:
提问者使用了OpenCV教程中的代码,并修改了颜色效果方法以允许设置白平衡。他们还在主线程中添加了一个调用来设置正确的白平衡。对于问题3,他们使用了Java答案中的色彩逻辑算法。
以下是整理后的文章:
在Android手机上使用摄像头和OpenCV来检测不同颜色的LED灯,下面是一些解决方法。
首先,我们可以使用OpenCV教程中的代码,并修改颜色效果方法来实现设置白平衡。下面是一些相关的代码:
public ListgetWhiteBalanceList() { return mCamera.getParameters().getSupportedWhiteBalance(); } public boolean isWhiteBalanceSupported() { return (mCamera.getParameters().getWhiteBalance() != null); } public String getWhiteBalance() { return mCamera.getParameters().getWhiteBalance(); } public void setWhiteBalance(String whiteBalance) { Camera.Parameters params = mCamera.getParameters(); params.setWhiteBalance(whiteBalance); mCamera.setParameters(params); }
通过调用上述方法,我们可以设置正确的白平衡。例如:
mOpenCvCameraView.setWhiteBalance(Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT);
此外,为了检测不同颜色的LED灯,我们可以使用一个称为“Color Logic Algorithm”的Java答案。具体代码如下:
// Color Logic Algorithm
通过使用上述方法和算法,我们可以在Android手机上使用摄像头和OpenCV来检测不同颜色的LED灯。希望这些方法对你有帮助!