#include <stdio.h>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#ifndef _DEBUG
#pragma comment(lib,"IlmImf.lib")
#pragma comment(lib,"libjasper.lib")
#pragma comment(lib,"libjpeg.lib")
#pragma comment(lib,"libpng.lib")
#pragma comment(lib,"libtiff.lib")
#pragma comment(lib,"zlib.lib")
#pragma comment(lib,"opencv_calib3d2411.lib")
#pragma comment(lib,"opencv_contrib2411.lib")
#pragma comment(lib,"opencv_core2411.lib")
#pragma comment(lib,"opencv_features2d2411.lib")
#pragma comment(lib,"opencv_flann2411.lib")
#pragma comment(lib,"opencv_gpu2411.lib")
#pragma comment(lib,"opencv_highgui2411.lib")
#pragma comment(lib,"opencv_imgproc2411.lib")
#pragma comment(lib,"opencv_legacy2411.lib")
#pragma comment(lib,"opencv_ml2411.lib")
#pragma comment(lib,"opencv_nonfree2411.lib")
#pragma comment(lib,"opencv_objdetect2411.lib")
#pragma comment(lib,"opencv_ocl2411.lib")
#pragma comment(lib,"opencv_photo2411.lib")
#pragma comment(lib,"opencv_stitching2411.lib")
#pragma comment(lib,"opencv_superres2411.lib")
#pragma comment(lib,"opencv_ts2411.lib")
#pragma comment(lib,"opencv_video2411.lib")
#pragma comment(lib,"opencv_videostab2411.lib")
#else
#pragma comment(lib,"zlibd.lib")
#pragma comment(lib,"IlmImfd.lib")
#pragma comment(lib,"libjasperd.lib")
#pragma comment(lib,"libjpegd.lib")
#pragma comment(lib,"libpngd.lib")
#pragma comment(lib,"libtiffd.lib")
#pragma comment(lib,"opencv_calib3d2411d.lib")
#pragma comment(lib,"opencv_contrib2411d.lib")
#pragma comment(lib,"opencv_core2411d.lib")
#pragma comment(lib,"opencv_features2d2411d.lib")
#pragma comment(lib,"opencv_flann2411d.lib")
#pragma comment(lib,"opencv_gpu2411d.lib")
#pragma comment(lib,"opencv_highgui2411d.lib")
#pragma comment(lib,"opencv_imgproc2411d.lib")
#pragma comment(lib,"opencv_legacy2411d.lib")
#pragma comment(lib,"opencv_ml2411d.lib")
#pragma comment(lib,"opencv_nonfree2411d.lib")
#pragma comment(lib,"opencv_objdetect2411d.lib")
#pragma comment(lib,"opencv_ocl2411d.lib")
#pragma comment(lib,"opencv_photo2411d.lib")
#pragma comment(lib,"opencv_stitching2411d.lib")
#pragma comment(lib,"opencv_superres2411d.lib")
#pragma comment(lib,"opencv_ts2411d.lib")
#pragma comment(lib,"opencv_video2411d.lib")
#pragma comment(lib,"opencv_videostab2411d.lib")
#endif using namespace cv;
using namespace std;
#include <math.h>
#include "opencv\highgui.h"
#include "opencv\cv.h"
#include "time.h"
#include <iostream>struct BGR
{
uchar b;
uchar g;
uchar r;
};struct HSV
{
int h;
double s;
double v;
};bool IsEquals(double val1 , double val2 )
{
return fabs( val1 - val2) < 0.00001;
}//RGB(BGR: 0~255)转HSV(H: [0~360), S: [0~1], V: [0~1])
void BGR2HSV(BGR &bgr, HSV &hsv)
{
double b, g, r;
double h, s, v;
double min, max;
double delta; b = bgr.b / 255.0;
g = bgr.g / 255.0;
r = bgr.r / 255.0; if (r > g)
{
max = MAX( r, b);
min = MIN( g, b);
}
else
{
max = MAX( g, b);
min = MIN( r, b);
} v = max;
delta = max - min; if (IsEquals( max, 0))
{
s = 0.0;
}
else
{
s = delta/ max;
} if (max == min)
{
h = 0.0;
}
else
{
if ( IsEquals( r, max) && g >= b)
{
h = 60 * ( g - b)/ delta + 0;
}
else if ( IsEquals( r, max) && g < b)
{
h = 60 * ( g - b)/ delta + 360;
}
else if ( IsEquals( g, max))
{
h = 60 * ( b - r)/ delta + 120;
}
else if ( IsEquals( b, max))
{
h = 60 * ( r - g)/ delta + 240;
}
} hsv.h = ( int)( h + 0.5);
hsv.h = ( hsv. h > 359) ? ( hsv. h - 360) : hsv. h;
hsv.h = ( hsv. h < 0) ? ( hsv. h + 360) : hsv. h; //hsv. h = hsv. h + 60;// h取值范围为[0, 360)
//hsv. h = ( hsv. h > 359) ? (hsv. h - 360): hsv. h;
//hsv. h = ( hsv. h < 0) ? ( hsv. h + 360) : hsv. h; hsv.s = s;
hsv.v = v;
}//RGB(BGR: 0~255)转HSV(H: [0~360), S: [0~1], V: [0~1])
void HSV2BGR(HSV &hsv, BGR &bgr)
{
int h = hsv.h;
double s = hsv. s;
double v = hsv. v;
double b = 0.0;
double g = 0.0;
double r = 0.0; int flag = ( int) abs( h/60.0 );
double f = h/60.0 - flag;
double p = v * (1 - s);
double q = v * (1 - f* s);
double t = v * (1 - (1- f)* s); switch ( flag)
{
case 0:
b = p;
g = t;
r = v;
break;
case 1:
b = p;
g = v;
r = q;
break;
case 2:
b = t;
g = v;
r = p;
break;
case 3:
b = v;
g = q;
r = p;
break;
case 4:
b = v;
g = p;
r = t;
break;
case 5:
b = q;
g = p;
r = v;
break;
default:
break;
} int blue = int( b * 255);
bgr.b = ( blue > 255) ? 255 : blue;
bgr.b = ( blue < 0) ? 0 : bgr. b; int green = int( g * 255);
bgr.g = ( green > 255) ? 255 : green;
bgr.g = ( green < 0) ? 0 : bgr. g; int red = int( r * 255);
bgr.r = ( red > 255) ? 255 : red;
bgr.r = ( red < 0) ? 0 : bgr. r;
}int main()
{
string imgName = "D:/opencv/images/lena.jpg";
Mat img = cv::imread(imgName);
Mat tmp = img.clone(); if (img.data == NULL)
{
cout<< "Could not open or find the image"<<endl;
return -1;
} int row = img. rows;
int col = img. cols * img.channels();
uchar * pImg = NULL;
BGR bgr;
HSV hsv; for ( int i = 0; i < row; i++)
{
pImg = img. ptr< uchar>( i); // 遍历时用img.at()效率会降很多, 很耗时
for ( int j = 0; j < col; j+=3)
{
bgr. b = pImg[ j];
bgr. g = pImg[ j + 1];
bgr. r = pImg[ j + 2];
BGR2HSV( bgr, hsv);
pImg[j] = hsv.h/2;
pImg[j + 1] = hsv.s*255;
pImg[j + 2] = hsv.v*255; //HSV2BGR( hsv, bgr);
//pImg[j] = bgr. b;
//pImg[j + 1] = bgr. g;
//pImg[j + 2] = bgr. r;
}
}
imshow("hsv", img); cvtColor(img, img, CV_HSV2BGR);
#if 0
for ( int i = 0; i < row; i++)
{
pImg = img. ptr< uchar>( i); // 遍历时用img.at()效率会降很多, 很耗时
for ( int j = 0; j < col; j+=3)
{
//bgr. b = pImg[ j];
//bgr. g = pImg[ j + 1];
//bgr. r = pImg[ j + 2];
//BGR2HSV( bgr, hsv); hsv.h = pImg[j]*2 ;
hsv.s = pImg[j + 1]/255;
hsv.v = pImg[j + 2]/255; HSV2BGR( hsv, bgr);
pImg[j] = bgr. b;
pImg[j + 1] = bgr. g;
pImg[j + 2] = bgr. r;
}
}
#endif
imshow("dd", img);
cv::waitKey(); imshow("opencv", tmp);
cv::waitKey();
cvtColor(tmp, tmp, CV_BGR2HSV);
imshow("opencv", tmp);
cv::waitKey();
vector< Mat> channels;
split( tmp, channels);
//channels[0] += 30;//H 这里没有做范围判断,opencv的h取值范围为[0, 180)
//channels[1] += 100;//S
channels[2] += 100;//V
merge(channels, tmp);
cvtColor(tmp, tmp, CV_HSV2BGR);
imshow("opencv", tmp);
cv::waitKey(); return 0;
}int mainBak()
{
IplImage* image = cvLoadImage("D:/opencv/images/lena.jpg");
IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 );
cvCvtColor(image,hsv,CV_BGR2HSV); cvNamedWindow("saturate_SV",CV_WINDOW_AUTOSIZE);
cvShowImage("saturate_SV",hsv);
cvWaitKey(0);
cvReleaseImage(&hsv);
cvDestroyWindow("saturate_SV");
return 0;
}
cvCvtColor(image,hsv,CV_BGR2HSV); BGR2HSV( bgr, hsv);
转载
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
C++基础2
构造函数和析构函数构造函数
构造函数 析构函数