Estoy usando Ubuntu 14.04 y estoy tratando de compilar este código, pero me da estos errores no importa qué, yo creo que tiene algo que ver con la inclusión de la biblioteca OpenCV, pero no estoy seguro. Podría alguien ayudarme?
Errores:

principal.cc:66:37: error: ‘CV_RETR_EXTERNAL’ no se declaró en este ámbito

principal.cc:66:55: error: ‘CV_CHAIN_APPROX_NONE’ no se declaró en este ámbito

principal.cc:81:28: error: ‘CV_BGR2GRAY’ no se declaró en este ámbito

El Código(lo siento por el formato, yo simplemente no puede obtener este derecho):

#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;
}

ACTUALIZACIÓN: CV_RETR_EXTERNAL y CV_CHAIN_APPROX_NONE errores fueron corregidos mediante el uso de cv::»lo que sea».
Sin embargo, CV_BGR2GRAY error persiste, si se cambia a de cv::COLOR_BGR2GRAY todo el código que se resalta como buggy. Alguien tiene una pista?

  • Se intenta ::CV_RETR_EXTERNAL en lugar de CV_RETR_EXTERNAL?
  • ¿Qué versión de OpenCV estás usando? CV_RETR_EXTERNAL es de la API de C, así que es posible que no exista. Trate de cv::RETR_EXTERNAL lugar — no debería existir si la configuración es correcta.
  • Arelius y ypnos, yo uso la última versión de OpenCV (2.4.9 si no estoy equivocado). Voy a probar tu solución tan pronto se me llego a mi Ubuntu pc.
  • El uso de cv::RETR_EXTERNAL parte fija de la misma, todavía me main.cc:82:27: error: ‘BGR2GRAY’ is not a member of ‘cv’

2 Comentarios

  1. 19

    parece, que son (accidentalmente) el uso de la 3.0(master) opencv rama.

    un montón de constantes han cambiado, como la mayoría de los CV_ prefijos se han cambiado para cv:: espacio de nombres,
    CV_BGR2GRAY es ahora de cv::COLOR_BGR2GRAY, etc.

    también todas módulo encabezados fue uno, como opencv2/imgproc.ch .

    si tienes el código de la repo de github, y desea utilizar el 2.4.9 rama en su lugar,

    git checkout 2.4

    (en el opencv carpeta) te llevará allí. ofc usted tendrá que volver a ejecutar cmake y volver a compilar

    • Estoy corriendo 2.4.9, y acabo de probar con 2.4.8, ninguno de ellos funcionaba.
  2. 3

    Uso COLOR_RGB2GRAY en lugar de COLOR_BGR2GRAY. A mí me funcionó, a pesar de que estoy corriendo OpenCV 3.0. Puede que tenga que utilizar cv::COLOR_RGB2GRAY como los otros se recomienda, si se están ejecutando 2.4.

Dejar respuesta

Please enter your comment!
Please enter your name here