【问题标题】:Colour conversion not working in opencv?颜色转换在opencv中不起作用?
【发布时间】:2014-03-06 13:59:54
【问题描述】:
#include<highgui.h>
#include<cxcore.h>
#include<cv.h>


#include<stdio.h>
#include<stdlib.h>


int main(int argc, char* argv[])
{
  IplImage* img = cvLoadImage("hello.jpg", CV_WINDOW_FULLSCREEN );
  int *img_data;
  img_data = malloc(sizeof(*img_data)*img->height*img->width*img->nChannels);

  if (!img)
  {
    printf("Image can NOT Load!!!\n");
    return 1;
  }

  cvNamedWindow("myfirstwindow", CV_WINDOW_FREERATIO );
  cvShowImage("myfirstwindow", img);

  printf("Height: %d\nwidth: %d\nnchannels:%d\n",img->height,img->width,img->nChannels);
  cvCvtColor(img,img_data,CV_RGB2XYZ);
  cvWaitKey(0);
  cvReleaseImage(&img);

return 0;
}

在这个程序中,我尝试使用函数 cvCvtColor 将 RGB 颜色模型转换为 XYZ 颜色模型。我收到如下所示的错误:

OpenCV 错误:cvarrToMat 文件中的参数错误(未知数组类型) /build/buildd/opencv-2.3.1/modules/core/src/matrix.cpp,第 646 行 在抛出“cv::Exception”实例后调用终止
什么():/build/buildd/opencv-2.3.1/modules/core/src/matrix.cpp:646: 错误:(-5) 函数 cvarrToMat 中的未知数组类型

任何帮助或建议将不胜感激。谢谢。

【问题讨论】:

  • 您必须将 IplImage 作为第二个参数传递给 cvCvtColor,而不是像素指针(甚至是错误的类型,uchar* 不是 int*)。但是请停止使用过时的 C-API!
  • CV_WINDOW_FREERATIO 是 cvLoadImage 的无效参数,正如 haris 之前所说的
  • 能否请您建议使用哪个 API。谢谢。
  • @berak... OP 使用的是纯 C 语言,而不是 C++。那么C++ api如何在C代码中使用呢。

标签: c opencv image-processing


【解决方案1】:

帮自己(和我们)一个忙,然后切换到 c++ api。

老的c-api已经不再开发了,只是为了维护,不要在里面写任何新代码!

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"

using namespace cv;

int main()
{
    namedWindow("myfirstwindow", CV_WINDOW_FREERATIO );

    Mat img = imread("hello.jpg", CV_IMAGE_LOAD_COLOR);
    imshow("myfirstwindow",img);

    Mat hsv;
    cvtColor(img,hsv,CV_RGB2HSV);

    waitKey(0);
    return 0;
}

【讨论】:

    【解决方案2】:

    您正在传递枚举值CV_WINDOW_FULLSCREEN,它用于在调用cvNamedWindow 时指定窗口的属性。对于图像加载,它应该是一些枚举值,例如 CV_LOAD_IMAGE_COLORCV_LOAD_IMAGE_GRAYSCALE

    但是你的代码并没有在这里崩溃,因为幸运的是CV_WINDOW_FULLSCREENCV_LOAD_IMAGE_COLOR 的整数值是相同的,即1,所以基本上这些枚举值是相等。

    代码中错误的真正原因是您将原始int* 传递给函数cvCvtColor。所有 opencv C 函数都期望 IplImage* 作为参数。以下行导致错误。

    cvCvtColor(img,img_data,CV_RGB2XYZ);
    

    你可能想做这样的事情:

    int main(int argc, char* argv[])
    {
      IplImage* img = cvLoadImage("hello.jpg", CV_LOAD_IMAGE_COLOR);
      IplImage *img_data;
      img_data = cvCreateImage(cvGetSize(img), img->depth, img->nChannels);
    
      if (!img)
      {
        printf("Image can NOT Load!!!\n");
        return 1;
      }
    
      cvNamedWindow("myfirstwindow", CV_WINDOW_FREERATIO );
      cvShowImage("myfirstwindow", img);
    
      printf("Height: %d\nwidth: %d\nnchannels:%d\n",img->height,img->width,img->nChannels);
      cvCvtColor(img,img_data,CV_RGB2XYZ);
      cvWaitKey(0);
      cvReleaseImage(&img);
      cvReleaseImage(&img_data);
    
      return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您需要将 CV_LOAD_IMAGE_COLOR 传递给函数 cvLoadImage(),该函数将加载彩色图像。

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        • 2015-08-09
        • 1970-01-01
        • 2020-09-12
        • 2013-01-12
        • 2012-11-02
        相关资源
        最近更新 更多