gpt4 book ai didi

c++ - 如何处理 OpenCV 轮廓的坐标?

转载 作者:行者123 更新时间:2023-11-28 07:36:59 25 4
gpt4 key购买 nike

我有一张像下面这样的图片:

Braille

通过这个源码,我已经成功地提取了图像中每个点的中心坐标。

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cv.h>
#include <iostream>
#include <vector>

int main(int argc, char **argv)
{
cv::Mat matSrc,matTmp,matDst;
cv::Mat matV,matROI;
std::vector<cv::Mat> vectorHSV;
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
matSrc = cv::imread(argv[1],1);
// matSrc = cv::imread("123.jpg",1);
// cv::imshow("Source", matSrc);
cv::cvtColor(matSrc,matTmp,CV_RGB2HSV);
cv::split(matTmp,vectorHSV);
matV = vectorHSV[2];
matV.copyTo(matTmp);
cv::normalize(matTmp,matTmp,0,255,CV_MINMAX,CV_8UC1);
cv::medianBlur(matTmp,matTmp,5);
cv::adaptiveThreshold(matTmp,matTmp,255,CV_ADAPTIVE_THRESH_GAUSSIAN_C,CV_THRESH_BINARY_INV,125,7);
cv::equalizeHist(matTmp,matTmp);
// cv::erode(matTmp,matTmp,cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3)));
cv::morphologyEx(matTmp,matTmp,cv::MORPH_CLOSE,cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3)));
cv::Canny(matTmp,matTmp,50,150,3);
cv::Rect ROI(0,0,matTmp.cols,matTmp.rows);
matROI = matTmp(ROI);
cv::findContours(matROI,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_TC89_KCOS,cv::Point(0,0));
std::vector<cv::Moments> muDots(contours.size());
std::vector<cv::Point> mcDots(contours.size());
for(size_t c=0;c < contours.size();c++)
{
muDots[c] = cv::moments(contours[c],false);
mcDots[c] = cv::Point(static_cast<int>(muDots[c].m10/muDots[c].m00) , static_cast<int>(muDots[c].m01/muDots[c].m00));
}
for(int allDots=0;allDots < mcDots.size();allDots++)
{
std::cout << allDots << ": " << mcDots[allDots].x << "," << mcDots[allDots].y << std::endl;
}

matTmp.copyTo(matDst);
imshow("ROI",matROI);
// imshow("Result", matDst);
cv::waitKey(0);
return 0;
}

我想问的是如何处理轮廓(如果存在或不存在),简而言之我想在这个算法中做的事情:

for(x=0;x < Image.cols;x++)
{
for(y=0;y < Image.rows;y++)
{
if(Contour coordinates at X,Y = Exist)
{
vectorBraille.push_back = 1;
}
else
{
vectorBraille.push_back = 0;
}
}
}

拜托,我真的需要关于这个问题的建议,我有点卡在这里。

任何帮助将不胜感激。谢谢

最佳答案

用您的等高线创建响应图。将 DrawContours 与 hole_color=external_color>0 一起使用。阅读thisthis .示例代码:

cv::Mat responsemap = cv::Mat::zeros(height, width, CV_8UC1);
cv::DrawContours(responsemap, contours, external_color, hole_color, max_level, 1, 8);
if (responsemap.at<uchar>(y,x)!=0) std::cout<<"contour area";

如果您只需要在响应图上打印中心,则手动设置它们。

关于c++ - 如何处理 OpenCV 轮廓的坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16612443/

25 4 0
文章推荐: c++ - "Deadlock"与 MPI_Waitall
文章推荐: css -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com