我们如何从这些点上具有特定颜色的图片中检测点

Soh*_*aib 0 c++ opencv image-processing

我有一系列的图像.我在这里发布了一个示例图片.我需要从图像中提取特征作为每个图像上绘制的60个标记的坐标.然后从特定的标记(在鼻子上)我需要找到所有其他标记的距离.

我试图用openCV作为语言来完成这个并且正在阅读文档但是一周之后我仍然无法实现目标.任何人都可以指导我正确的方向.如果没有,整个解决方案会给我一个链接或教程,让我了解如何实现这一目标.

请参阅我上传的图片.标记在整个图像上涂成蓝色.这是需要取出功能的图像.

任何帮助,将不胜感激.谢谢.

这是我尝试过的代码,但事实证明它非常糟糕.

     //This function threshold the HSV image and create a binary image
Mat GetThresholdedImage(Mat imgRGB){        
    Mat imgThresh;   
    inRange(imgRGB, Scalar(95,110,151), Scalar(112,125,169), imgThresh); 
    return imgThresh;
} 
int main(){
 Mat frame;
 frame = imread("other/test2.jpeg");
 namedWindow("Input");      
 namedWindow("Ball");

 Mat imgRGB=frame.clone();

 Mat imgThresh = GetThresholdedImage(imgRGB);


 imshow("Ball", imgThresh);            
 imshow("Input", frame);

 waitKey(0);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

cyr*_*iel 5

这是很容易找到使用类似于你的代码的所有标记 - 你只需要图像转换为HSV色彩空间和比使用INRANGE功能 - HSV色彩空间是此类任务的更好,因为它的颜色"重点",而不是亮度.这段代码:

Mat m = imread("D:\\face.jpg"), m2, m3;
cvtColor(m, m, CV_RGB2HSV);
resize(m, m, Size(m.cols/2, m.rows/2));
inRange(m, Scalar(0, 90, 50), Scalar(15, 175, 190), m2); 
imshow("qwe", m);
imshow("qwe2", m2);
dilate(m2, m3, Mat());
imshow("qwe", m);
imshow("qwe2", m2);
imshow("qwe3", m3);
waitKey(-1);
return 0;
Run Code Online (Sandbox Code Playgroud)

有关此代码的几件事情:
-当然你必须改变文件路径
-调整大小并不重要-我只用它,因为图片太大,我的屏幕
- INRANGE标值可以很容易地通过查看显示的图像发现在HSV(OpenCV中显示了3个通道的RGB图像中的每个图像,所以看起来有点怪) -刚刚从窗口底部的读取值(可能你有QT打造OpenCV的这一点,否则窗口不会有这个信息):在此输入图像描述 注 - 值是其他的顺序通常(HSV),所以如果你读例如颜色(A,B,C)从屏幕的底部,你应该使用标量(C,A,B).

inRange后的结果:
在此输入图像描述 最后结果:
在此输入图像描述
正如你所看到的,有在图像上其他的对象,但应该很容易检测和清除 - 只是寻找标志物只有在区域与面(使用人脸检测)或简单地对每个轮廓找到它的边界矩形,并检查的百分比边界矩形区域是轮廓区域 - 如果此值小于丢弃此轮廓(因为它与圆形不相似).