将python代码转换为c ++时出现opencvcornerSubPix异常

Posted

技术标签:

【中文标题】将python代码转换为c ++时出现opencvcornerSubPix异常【英文标题】:opencv cornerSubPix Exception while converting python code to c++ 【发布时间】:2021-08-01 18:30:29 【问题描述】:

我正在尝试将 this response 移植到 c++,但我无法克服这个神秘的异常(见下图)。不知道限制因素是什么。我想这是图像颜色格式或角参数,但似乎没有任何效果。如果涉及到颜色格式转换请提供小代码sn-p。

Anubhav Singh 提供的 python 代码运行良好,但我想用 c++ 开发。任何帮助将不胜感激。

我正在使用 OpenCV04.2.0

void CornerDetection()
std::string image_path = samples::findFile("../wing.png");
Mat img = imread(image_path);

Mat greyMat;
Mat dst;

cv::cvtColor(img, greyMat, COLOR_BGR2GRAY);
threshold(greyMat, greyMat, 0, 255, THRESH_BINARY | THRESH_OTSU);

cornerHarris(greyMat, dst, 9, 5, 0.04);
dilate(dst, dst,NULL);

Mat img_thresh;
threshold(dst, img_thresh, 0.32 * 255, 255, 0);
img_thresh.convertTo(img_thresh, CV_8UC1);

Mat labels = Mat();
Mat stats = Mat();
Mat centroids = Mat();
cv::connectedComponentsWithStats(img_thresh, labels, stats, centroids, 8, CV_32S);
TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 30, 0.001);

std::vector<Point2f> corners = std::vector<Point2f>();

Size winSize = Size(5, 5);
Size zeroZone = Size(-1, -1);
cornerSubPix(greyMat, corners, winSize, zeroZone, criteria);

for (int i = 0; i < corners.size(); i++)

    circle(img, Point(corners[i].x, corners[i].y), 5, Scalar(0, 255, 0), 2);


imshow("img", img);
waitKey();
destroyAllWindows();

【问题讨论】:

【参考方案1】:

解决方案是在将corners 变量传递给cornerSubPix(...) 函数之前迭代质心以构建corners 向量。

std::vector<Point2f> corners = std::vector<Point2f>();

for (int i = 0; i < centroids.rows; i++)

    double x = centroids.at<double>(i, 0);
    double y = centroids.at<double>(i, 1);
    corners.push_back(Point2f(x, y));

解决方案的输出仍然不完全是 python 输出,不管它解决了这个问题,以防其他人遇到这个问题。

【讨论】:

以上是关于将python代码转换为c ++时出现opencvcornerSubPix异常的主要内容,如果未能解决你的问题,请参考以下文章

阻碍 Python 将 JSON 数据转换为转义的特殊字符时出现 Python UnicodeDecodeError [重复]

将视频转换为 H264 时出现无法识别的选项“c:v”ffmpeg 错误

如何在python中解压12个字节? php代码可用!试图将其转换为 python

将字符串转换为 int 时出现语法错误 [重复]

无法在python中将字符串转换为浮点数

将 C/C++ 无符号字符转换为 JAVA 时出现问题