行业知识
怎么运行/opencv/modules/imgproc/test下的test
2026-11-06 01:23:09
来源:互联网转载
怎么运行/opencv/modules/imgproc/test下的test_cvtyuv.cpp
要运行test_cvtyuv.cpp,��需要按照以下步骤操作:
()-
获取OpenCV源代码,编译并安装opencv:首先,确保你已经下载并安装了OpenCV。如果没有,请前往OpenCV官方网站下载源代码。安装参考连接:https://blog.csdn.net/shizuguilai/article/details/136406722
-
运行测试:在构建build目录中,你可以运行测试程序。使用以下命令:
()./bin/opencv_test_imgproc --gtest_filter=cvtyuv.*# 或者是下面这样?./bin/opencv_test_imgproc --gtest_filter=*ColorYUV* # 运行特定的颜色转换测试# 或者试试下面这个?注意!下面是gtestp不是gtest./bin/opencv_test_imgproc --gtestp_filter=Imgproc_ColorYUV.accuracy
这将运行与cvtyuv相关的所有测试用例。因为test_cvtyuv.cpp本身并不包含主函数(main),因为它是设计来被 OpenCV 的测试框架自动发现和执行的。测试框架(基于 Google Test)会自动识别 TEST_P 宏定义的测试用例并执行它们。
请注意,确保你的构建环境已经正确设置,以便能够编译和运行OpenCV。如果你遇到问题,可以查看OpenCV官方文档或在社区寻求帮助。
祝你好运!
test_cvtyuv.cpp源码如下:
#include "test_precomp.hpp"namespace opencv_test { namespace {#undef RGB#undef YUVtypedef Vec3b YUV;typedef Vec3b RGB;int countOfDifferencies(const Mat& gold, const Mat& result, int maxAllowedDifference = 1){ Mat diff; absdiff(gold, result, diff); return countNonZero(diff.reshape(1) > maxAllowedDifference);}class YUVreader{public: virtual ~YUVreader() {} virtual YUV read(const Mat& yuv, int row, int col) = 0; virtual int channels() = 0; virtual Size size(Size imgSize) = 0; virtual bool requiresEvenHeight() { return true; } virtual bool requiresEvenWidth() { return true; } static YUVreader* getReader(int code);};class RGBreader{public: virtual ~RGBreader() {} virtual RGB read(const Mat& rgb, int row, int col) = 0; virtual int channels() = 0; static RGBreader* getReader(int code);};class RGBwriter{public: virtual ~RGBwriter() {} virtual void write(Mat& rgb, int row, int col, const RGB& val) = 0; virtual int channels() = 0; static RGBwriter* getWriter(int code);};class GRAYwriter{public: virtual ~GRAYwriter() {} virtual void write(Mat& gray, int row, int col, const uchar& val) { gray.at(row, col) = val; } virtual int channels() { return 1; } static GRAYwriter* getWriter(int code);};class YUVwriter{public: virtual ~YUVwriter() {} virtual void write(Mat& yuv, int row, int col, const YUV& val) = 0; virtual int channels() = 0; virtual Size size(Size imgSize) = 0; virtual bool requiresEvenHeight() { return true; } virtual bool requiresEvenWidth() { return true; } static YUVwriter* getWriter(int code);};class RGB888Writer : public RGBwriter{ void write(Mat& rgb, int row, int col, const RGB& val) { rgb.at(row, col) = val; } int channels() { return 3; }};class BGR888Writer : public RGBwriter{ void write(Mat& rgb, int row, int col, const RGB& val) { Vec3b tmp(val[2], val[1], val[0]); rgb.at(row, col) = tmp; } int channels() { return 3; }};class RGBA8888Writer : public RGBwriter{ void write(Mat& rgb, int row, int col, const RGB& val) { Vec4b tmp(val[0], val[1], val[2], 255); rgb.at(row, col) = tmp; } int channels() { return 4; }};class BGRA8888Writer : public RGBwriter{ void write(Mat& rgb, int row, int col, const RGB& val) { Vec4b tmp(val[2], val[1], val[0], 255); rgb.at(row, col) = tmp; } int channels() { return 4; }};class YUV420pWriter: public YUVwriter{ int channels() { return 1; } Size size(Size imgSize) { return Size(imgSize.width, imgSize.height + imgSize.height/2); }};class YV12Writer: public YUV420pWriter{ void write(Mat& yuv, int row, int col, const YUV& val) { int h = yuv.rows * 2 / 3; yuv.ptr(row)[col] = val[0]; if( row % 2 == 0 && col % 2 == 0 ) { yuv.ptr(h + row/4)[col/2 + ((row/2) % 2) * (yuv.cols/2)] = val[2]; yuv.ptr(h + (row/2 + h/2)/2)[col/2 + ((row/2 + h/2) % 2) * (yuv.cols/2)] = val[1]; } }};class I420Writer: public YUV420pWriter{ void write(Mat& yuv, int row, int col, const YUV& val) { int h = yuv.rows * 2 / 3; yuv.ptr(row)[col] = val[0]; if( row % 2 == 0 && col % 2 == 0 ) { yuv.ptr(h + row/4)[col/2 + ((row/2) % 2) * (yuv.cols/2)] = val[1]; yuv.ptr(h + (row/2 + h/2)/2)[col/2 + ((row/2 + h/2) % 2) * (yuv.cols/2)] = val[2]; } }};class YUV420Reader: public YUVreader{ int channels() { return 1; } Size size(Size imgSize) { return Size(imgSize.width, imgSize.height * 3 / 2); }};class YUV422Reader: public YUVreader{ int channels() { return 2; } Size size(Size imgSize) { return imgSize; } bool requiresEvenHeight() { return false; }};class NV21Reader: public YUV420Reader{ YUV read(const Mat& yuv, int row, int col) { uchar y = yuv.ptr(row)[col]; uchar u = yuv.ptr(yuv.rows * 2 / 3 + row/2)[(col/2)*2 + 1]; uchar v = yuv.ptr(yuv.rows * 2 / 3 + row/2)[(col/2)*2]; return YUV(y, u, v); }};struct NV12Reader: public YUV420Reader{ YUV read(const Mat& yuv, int row, int col) { uchar y = yuv.ptr(row)[col]; uchar u = yuv.ptr(yuv.rows * 2 / 3 + row/2)[(col/2)*2]; uchar v = yuv.ptr(yuv.rows * 2 / 3 + row/2)[(col/2)*2 + 1]; return YUV(y, u, v); }};class YV12Reader: public YUV420Reader{ YUV read(const Mat& yuv, int row, int col) { int h = yuv.rows * 2 / 3; uchar y = yuv.ptr(row)[col]; uchar u = yuv.ptr(h + (row/2 + h/2)/2)[col/2 + ((row/2 + h/2) % 2) * (yuv.cols/2)]; uchar v = yuv.ptr(h + row/4)[col/2 + ((row/2) % 2) * (yuv.cols/2)]; return YUV(y, u, v); }};class IYUVReader: public YUV420Reader{ YUV read(const Mat& yuv, int row, int col) { int h = yuv.rows * 2 / 3; uchar y = yuv.ptr(row)[col]; uchar u = yuv.ptr(h + row/4)[col/2 + ((row/2) % 2) * (yuv.cols/2)]; uchar v = yuv.ptr(h + (row/2 + h/2)/2)[col/2 + ((row/2 + h/2) % 2) * (yuv.cols/2)]; return YUV(y, u, v); }};class UYVYReader: public YUV422Reader{ YUV read(const Mat& yuv, int row, int col) { uchar y = yuv.ptr(row)[col][1]; uchar u = yuv.ptr(row)[(col/2)*2][0]; uchar v = yuv.ptr(row)[(col/2)*2 + 1][0]; return YUV(y, u, v); }};class YUY2Reader: public YUV422Reader{ YUV read(const Mat& yuv, int row, int col) { uchar y = yuv.ptr(row)[col][0]; uchar u = yuv.ptr(row)[(col/2)*2][1]; uchar v = yuv.ptr(row)[(col/2)*2 + 1][1]; return YUV(y, u, v); }};class YVYUReader: public YUV422Reader{ YUV read(const Mat& yuv, int row, int col) { uchar y = yuv.ptr(row)[col][0]; uchar u = yuv.ptr(row)[(col/2)*2 + 1][1]; uchar v = yuv.ptr(row)[(col/2)*2][1]; return YUV(y, u, v); }};class YUV888Reader : public YUVreader{ YUV read(const Mat& yuv, int row, int col) { return yuv.at(row, col); } int channels() { return 3; } Size size(Size imgSize) { return imgSize; } bool requiresEvenHeight() { return false; } bool requiresEvenWidth() { return false; }};class RGB888Reader : public RGBreader{ RGB read(const Mat& rgb, int row, int col) { return rgb.at(row, col); } int channels() { return 3; }};class BGR888Reader : public RGBreader{ RGB read(const Mat& rgb, int row, int col) { RGB tmp = rgb.at(row, col); return RGB(tmp[2], tmp[1], tmp[0]); } int channels() { return 3; }};class RGBA8888Reader : public RGBreader{ RGB read(const Mat& rgb, int row, int col) { Vec4b rgba = rgb.at(row, col); return RGB(rgba[0], rgba[1], rgba[2]); } int channels() { return 4; }};class BGRA8888Reader : public RGBreader{ RGB read(const Mat& rgb, int row, int col) { Vec4b rgba = rgb.at(row, col); return RGB(rgba[2], rgba[1], rgba[0]); } int channels() { return 4; }};class YUV2RGB_Converter{public: RGB convert(YUV yuv) { int y = std::max(0, yuv[0] - 16); int u = yuv[1] - 128; int v = yuv[2] - 128; uchar r = saturate_cast(1.164f * y + 1.596f * v); uchar g = saturate_cast(1.164f * y - 0.813f * v - 0.391f * u); uchar b = saturate_cast(1.164f * y + 2.018f * u); return RGB(r, g, b); }};class YUV2GRAY_Converter{public: uchar convert(YUV yuv) { return yuv[0]; }};class RGB2YUV_Converter{public: YUV convert(RGB rgb) { int r = rgb[0]; int g = rgb[1]; int b = rgb[2]; uchar y = saturate_cast((int)( 0.257f*r + 0.504f*g + 0.098f*b + 0.5f) + 16); uchar u = saturate_cast((int)(-0.148f*r - 0.291f*g + 0.439f*b + 0.5f) + 128); uchar v = saturate_cast((int)( 0.439f*r - 0.368f*g - 0.071f*b + 0.5f) + 128); return YUV(y, u, v); }};YUVreader* YUVreader::getReader(int code){ switch(code) { case COLOR_YUV2RGB_NV12: case COLOR_YUV2BGR_NV12: case COLOR_YUV2RGBA_NV12: case COLOR_YUV2BGRA_NV12: return new NV12Reader(); case COLOR_YUV2RGB_NV21: case COLOR_YUV2BGR_NV21: case COLOR_YUV2RGBA_NV21: case COLOR_YUV2BGRA_NV21: return new NV21Reader(); case COLOR_YUV2RGB_YV12: case COLOR_YUV2BGR_YV12: case COLOR_YUV2RGBA_YV12: case COLOR_YUV2BGRA_YV12: return new YV12Reader(); case COLOR_YUV2RGB_IYUV: case COLOR_YUV2BGR_IYUV: case COLOR_YUV2RGBA_IYUV: case COLOR_YUV2BGRA_IYUV: return new IYUVReader(); case COLOR_YUV2RGB_UYVY: case COLOR_YUV2BGR_UYVY: case COLOR_YUV2RGBA_UYVY: case COLOR_YUV2BGRA_UYVY: return new UYVYReader(); //case COLOR_YUV2RGB_VYUY = 109, //case COLOR_YUV2BGR_VYUY = 110, //case COLOR_YUV2RGBA_VYUY = 113, //case COLOR_YUV2BGRA_VYUY = 114, // return ?? case COLOR_YUV2RGB_YUY2: case COLOR_YUV2BGR_YUY2: case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2BGRA_YUY2: return new YUY2Reader(); case COLOR_YUV2RGB_YVYU: case COLOR_YUV2BGR_YVYU: case COLOR_YUV2RGBA_YVYU: case COLOR_YUV2BGRA_YVYU: return new YVYUReader(); case COLOR_YUV2GRAY_420: return new NV21Reader(); case COLOR_YUV2GRAY_UYVY: return new UYVYReader(); case COLOR_YUV2GRAY_YUY2: return new YUY2Reader(); case COLOR_YUV2BGR: case COLOR_YUV2RGB: return new YUV888Reader(); default: return 0; }}RGBreader* RGBreader::getReader(int code){ switch(code) { case COLOR_RGB2YUV_YV12: case COLOR_RGB2YUV_I420: return new RGB888Reader(); case COLOR_BGR2YUV_YV12: case COLOR_BGR2YUV_I420: return new BGR888Reader(); case COLOR_RGBA2YUV_I420: case COLOR_RGBA2YUV_YV12: return new RGBA8888Reader(); case COLOR_BGRA2YUV_YV12: case COLOR_BGRA2YUV_I420: return new BGRA8888Reader(); default: return 0; };}RGBwriter* RGBwriter::getWriter(int code){ switch(code) { case COLOR_YUV2RGB_NV12: case COLOR_YUV2RGB_NV21: case COLOR_YUV2RGB_YV12: case COLOR_YUV2RGB_IYUV: case COLOR_YUV2RGB_UYVY: //case COLOR_YUV2RGB_VYUY: case COLOR_YUV2RGB_YUY2: case COLOR_YUV2RGB_YVYU: case COLOR_YUV2RGB: return new RGB888Writer(); case COLOR_YUV2BGR_NV12: case COLOR_YUV2BGR_NV21: case COLOR_YUV2BGR_YV12: case COLOR_YUV2BGR_IYUV: case COLOR_YUV2BGR_UYVY: //case COLOR_YUV2BGR_VYUY: case COLOR_YUV2BGR_YUY2: case COLOR_YUV2BGR_YVYU: case COLOR_YUV2BGR: return new BGR888Writer(); case COLOR_YUV2RGBA_NV12: case COLOR_YUV2RGBA_NV21: case COLOR_YUV2RGBA_YV12: case COLOR_YUV2RGBA_IYUV: case COLOR_YUV2RGBA_UYVY: //case COLOR_YUV2RGBA_VYUY: case COLOR_YUV2RGBA_YUY2: case COLOR_YUV2RGBA_YVYU: return new RGBA8888Writer(); case COLOR_YUV2BGRA_NV12: case COLOR_YUV2BGRA_NV21: case COLOR_YUV2BGRA_YV12: case COLOR_YUV2BGRA_IYUV: case COLOR_YUV2BGRA_UYVY: //case COLOR_YUV2BGRA_VYUY: case COLOR_YUV2BGRA_YUY2: case COLOR_YUV2BGRA_YVYU: return new BGRA8888Writer(); default: return 0; };}GRAYwriter* GRAYwriter::getWriter(int code){ switch(code) { case COLOR_YUV2GRAY_420: case COLOR_YUV2GRAY_UYVY: case COLOR_YUV2GRAY_YUY2: return new GRAYwriter(); default: return 0; }}YUVwriter* YUVwriter::getWriter(int code){ switch(code) { case COLOR_RGB2YUV_YV12: case COLOR_BGR2YUV_YV12: case COLOR_RGBA2YUV_YV12: case COLOR_BGRA2YUV_YV12: return new YV12Writer(); case COLOR_RGB2YUV_I420: case COLOR_BGR2YUV_I420: case COLOR_RGBA2YUV_I420: case COLOR_BGRA2YUV_I420: return new I420Writer(); default: return 0; };}templatevoid referenceYUV2RGB(const Mat& yuv, Mat& rgb, YUVreader* yuvReader, RGBwriter* rgbWriter){ convertor cvt; for(int row = 0; row write(rgb, row, col, cvt.convert(yuvReader->read(yuv, row, col)));}templatevoid referenceYUV2GRAY(const Mat& yuv, Mat& rgb, YUVreader* yuvReader, GRAYwriter* grayWriter){ convertor cvt; for(int row = 0; row write(rgb, row, col, cvt.convert(yuvReader->read(yuv, row, col)));}templatevoid referenceRGB2YUV(const Mat& rgb, Mat& yuv, RGBreader* rgbReader, YUVwriter* yuvWriter){ convertor cvt; for(int row = 0; row write(yuv, row, col, cvt.convert(rgbReader->read(rgb, row, col)));}struct ConversionYUV{ explicit ConversionYUV( const int code ) { yuvReader_ = YUVreader :: getReader(code); yuvWriter_ = YUVwriter :: getWriter(code); rgbReader_ = RGBreader :: getReader(code); rgbWriter_ = RGBwriter :: getWriter(code); grayWriter_ = GRAYwriter:: getWriter(code); } ~ConversionYUV() { if (yuvReader_) delete yuvReader_; if (yuvWriter_) delete yuvWriter_; if (rgbReader_) delete rgbReader_; if (rgbWriter_) delete rgbWriter_; if (grayWriter_) delete grayWriter_; } int getDcn() { return (rgbWriter_ != 0) ? rgbWriter_->channels() : ((grayWriter_ != 0) ? grayWriter_->channels() : yuvWriter_->channels()); } int getScn() { return (yuvReader_ != 0) ? yuvReader_->channels() : rgbReader_->channels(); } Size getSrcSize( const Size& imgSize ) { return (yuvReader_ != 0) ? yuvReader_->size(imgSize) : imgSize; } Size getDstSize( const Size& imgSize ) { return (yuvWriter_ != 0) ? yuvWriter_->size(imgSize) : imgSize; } bool requiresEvenHeight() { return (yuvReader_ != 0) ? yuvReader_->requiresEvenHeight() : ((yuvWriter_ != 0) ? yuvWriter_->requiresEvenHeight() : false); } bool requiresEvenWidth() { return (yuvReader_ != 0) ? yuvReader_->requiresEvenWidth() : ((yuvWriter_ != 0) ? yuvWriter_->requiresEvenWidth() : false); } YUVreader* yuvReader_; YUVwriter* yuvWriter_; RGBreader* rgbReader_; RGBwriter* rgbWriter_; GRAYwriter* grayWriter_;};CV_ENUM(YUVCVTS, COLOR_YUV2RGB_NV12, COLOR_YUV2BGR_NV12, COLOR_YUV2RGB_NV21, COLOR_YUV2BGR_NV21, COLOR_YUV2RGBA_NV12, COLOR_YUV2BGRA_NV12, COLOR_YUV2RGBA_NV21, COLOR_YUV2BGRA_NV21, COLOR_YUV2RGB_YV12, COLOR_YUV2BGR_YV12, COLOR_YUV2RGB_IYUV, COLOR_YUV2BGR_IYUV, COLOR_YUV2RGBA_YV12, COLOR_YUV2BGRA_YV12, COLOR_YUV2RGBA_IYUV, COLOR_YUV2BGRA_IYUV, COLOR_YUV2RGB_UYVY, COLOR_YUV2BGR_UYVY, COLOR_YUV2RGBA_UYVY, COLOR_YUV2BGRA_UYVY, COLOR_YUV2RGB_YUY2, COLOR_YUV2BGR_YUY2, COLOR_YUV2RGB_YVYU, COLOR_YUV2BGR_YVYU, COLOR_YUV2RGBA_YUY2, COLOR_YUV2BGRA_YUY2, COLOR_YUV2RGBA_YVYU, COLOR_YUV2BGRA_YVYU, COLOR_YUV2GRAY_420, COLOR_YUV2GRAY_UYVY, COLOR_YUV2GRAY_YUY2, COLOR_YUV2BGR, COLOR_YUV2RGB, COLOR_RGB2YUV_YV12, COLOR_BGR2YUV_YV12, COLOR_RGBA2YUV_YV12, COLOR_BGRA2YUV_YV12, COLOR_RGB2YUV_I420, COLOR_BGR2YUV_I420, COLOR_RGBA2YUV_I420, COLOR_BGRA2YUV_I420)typedef ::testing::TestWithParam Imgproc_ColorYUV;TEST_P(Imgproc_ColorYUV, accuracy){ int code = GetParam(); RNG& random = theRNG(); ConversionYUV cvt(code); const int scn = cvt.getScn(); const int dcn = cvt.getDcn(); for(int iter = 0; iter 源:
(1) openCV:环境配置和测试代码_opencv配置好了,怎么在studio中测试包含的代码-CSDN博客.
(2) imgproc 模块. 图像处理 — OpenCV 2.3.2 documentation.