Open-CV - 未正确加载
Posted
技术标签:
【中文标题】Open-CV - 未正确加载【英文标题】:Open-CV - Not loading correctly 【发布时间】:2014-07-18 07:49:30 【问题描述】:我正在使用 Ubuntu 14.04 并且正在尝试编译此代码,但无论如何我都会遇到这些错误,我相信这与包含 OpenCV 库有关,但我不确定。谁能帮帮我? 错误:
main.cc:66:37: 错误:“CV_RETR_EXTERNAL”未在此范围内声明
main.cc:66:55: 错误:“CV_CHAIN_APPROX_NONE”未在此范围内声明
main.cc:81:28: 错误:“CV_BGR2GRAY”未在此范围内声明
代码(抱歉格式化,我无法正确理解):
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <tesseract/baseapi.h>
#include <iostream>
void rgb2cmyk(cv::Mat& src, std::vector<cv::Mat>& cmyk)
CV_Assert(src.type() == CV_8UC3);
cmyk.clear();
for (int i = 0; i < 4; ++i)
cmyk.push_back(cv::Mat(src.size(), CV_32F));
for (int i = 0; i < src.rows; ++i)
for (int j = 0; j < src.cols; ++j)
cv::Vec3b p = src.at<cv::Vec3b>(i,j);
float r = p[2] / 255.;
float g = p[1] / 255.;
float b = p[0] / 255.;
float k = (1 - std::max(std::max(r,g),b));
cmyk[0].at<float>(i,j) = (1 - r - k) / (1 - k);
cmyk[1].at<float>(i,j) = (1 - g - k) / (1 - k);
cmyk[2].at<float>(i,j) = (1 - b - k) / (1 - k);
cmyk[3].at<float>(i,j) = k;
int main()
cv::Mat im0 = cv::imread("scratchcard.png");
if (!im0.data)
return -1;
std::vector<cv::Mat> cmyk;
rgb2cmyk(im0, cmyk);
cv::Mat im1;
im1 = cmyk[3].mul(1 - cmyk[1]) > 0.25;
cv::Mat im2;
im1.convertTo(im2, CV_8U);
std::vector<std::vector<cv::Point> > contours;
cv::findContours(im2, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
double max_area = 0;
int max_idx = 0;
for (int i = 0; i < contours.size(); i++)
double area = cv::contourArea(contours[i]);
max_idx = area > max_area ? i : max_idx;
max_area = area > max_area ? area : max_area;
im2.setTo(cv::Scalar(0));
cv::drawContours(im2, contours, max_idx, cv::Scalar(255), -1);
cv::Mat im3;
cv::cvtColor(im0, im3, CV_BGR2GRAY);
im3 = ((255 - im3) & im2) > 200;
cv::Mat dst = im3.clone();
cv::findContours(dst.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
for (int i = 0; i < contours.size(); i++)
if (cv::contourArea(contours[i]) < 100)
cv::drawContours(dst, contours, i, cv::Scalar(0), -1);
tesseract::TessBaseAPI tess;
tess.Init(NULL, "eng", tesseract::OEM_DEFAULT);
tess.SetVariable("tessedit_char_whitelist", "0123456789");
tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK);
tess.SetImage((uchar*)dst.data, dst.cols, dst.rows, 1, dst.cols);
char* out = tess.GetUTF8Text();
std::cout << out << std::endl;
cv::imshow("src", im0);
cv::imshow("dst", dst);
cv::waitKey();
return 0;
更新:使用 cv::"whatever" 修复了 CV_RETR_EXTERNAL 和 CV_CHAIN_APPROX_NONE 错误。 但是,CV_BGR2GRAY 错误仍然存在,如果更改为 cv::COLOR_BGR2GRAY,则整个代码将突出显示为错误。有人知道吗?
【问题讨论】:
您是否尝试过 ::CV_RETR_EXTERNAL 而不是 CV_RETR_EXTERNAL? 您使用的是什么版本的 OpenCV? CV_RETR_EXTERNAL 来自 C API,因此它可能不存在。试试 cv::RETR_EXTERNAL - 如果你的设置正确,它应该存在。 Arelius 和 ypnos,我使用的是最新的 OpenCV 版本(如果我没记错的话是 2.4.9)。我一到我的 Ubuntu 电脑就会测试你的解决方案。 使用 cv::RETR_EXTERNAL 固定部分,我仍然得到main.cc:82:27: error: ‘BGR2GRAY’ is not a member of ‘cv’
【参考方案1】:
看来,您(不小心)正在使用 3.0(master) opencv 分支。
那里的很多常量都发生了变化,比如大多数 CV_ 前缀都更改为 cv:: 命名空间, CV_BGR2GRAY 现在是 cv::COLOR_BGR2GRAY 等。
所有模块头文件也都上升了,比如 opencv2/imgproc.hpp 。
如果您从 github repo 获得代码,并想使用 2.4.9 分支,
git checkout 2.4
(在 opencv 文件夹中)将带您到那里。 ofc 你将不得不重新运行 cmake 并重新编译
【讨论】:
我正在运行 2.4.9,我刚刚用 2.4.8 进行了测试,它们都没有工作。【参考方案2】:使用COLOR_RGB2GRAY
而不是COLOR_BGR2GRAY
。它对我有用,虽然我运行的是 OpenCV 3.0。如果您运行的是 2.4,您可能必须按照其他人的建议使用 cv::COLOR_RGB2GRAY
。
【讨论】:
cv::COLOR_BGR2GRAY
在 OpenCV 4.x 中为我工作以上是关于Open-CV - 未正确加载的主要内容,如果未能解决你的问题,请参考以下文章