使用opencv进行正确颜色识别的可能的机器视觉解决方案是什么?
我必须检查以下连接器的颜色顺序是否正确。 使用颜色重新定位技术或模式匹配技术更好吗? 有没有更好的方法来解决这个问题?
图中波纹管是带彩色线的连接器,如何检查正确的电线顺序?
答案 0 :(得分:4)
我建议执行以下步骤(使用简单的代码ilustration):
转换为L a b色彩空间;
https://en.wikipedia.org/wiki/Lab_color_space/
cv::cvtColor(img,img,CV_BGR2Lab);
获取仅包含电线的子图像
img = img(cv::Rect(x,y,width,height)); // detect wires
计算每列的平均值并获得值的1D向量
std::vector<cv::Vec3f> aggregatedVector;
for(int i=0;i<img.cols;i++)
{
cv::Vec3f sum = cv::Vec3f(0,0,0);
for(int j=0;j<img.rows;j++)
{
sum[0]+= img.at<Vecb>(j,i)[0]);
sum[1]+= img.at<Vecb>(j,i)[1];
sum[2]+= img.at<Vecb>(j,i)[2];
}
sum = sum/img.rows;
aggregatedVector.push_back(sum);
}
使用例如渐变和使用20获取向量来提取均匀字段 值
std::vector<Vec3f> fields
cv::Vec3f mean = 0;
int counter =0;
for(int i=0;i<aggregatedVector.size();i++)
{
mean+= aggregatedVector[i];
if(cv::norm(aggregatedVector[i+1] - aggregatedVector[i]) > /*thresh here */
{
fields.push_back(mean/(double)counter);
mean = cv::Vec3f(0,0,0);
counter=0;
}
counter++
}
计算计算矢量和参考值之间的颜色距离矢量
double totalError = 0;
for(int i=0;i<fields.size();i++)
{
totalError+= cv::mean(reference[i]-fields[i]);
}
然后您可以根据错误向量值做出决定。玩得开心!