2013-05-20 2 views
0

Пожалуйста, посмотрите на следующий кодИзменение яркости и контрастности изображения

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 

using namespace std; 
using namespace cv; 

Mat change(Mat m); 

int main() 

{ 
    Mat image = imread("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg"); 

    Mat copy = Mat::zeros(image.size(),image.type()); 

    Mat changedImage = change(copy); 

    namedWindow("Image"); 
    imshow("Image",changedImage); 

    waitKey(0); 
} 

Mat change(Mat m) 
{ 
    int cols = m.cols; 
    int rows = m.rows; 

    double alpha = 2.2; 
    int beta = 50; 


    for(int i=0;i<rows;i++) 
    { 
     for(int c=0;c<cols;c++) 
     { 
      m.at<Vec3b>(rows,c)[0] = saturate_cast<uchar>(alpha* (m.at<Vec3b>(rows,cols)[0]) + beta); 
      m.at<Vec3b>(rows,c)[1] = saturate_cast<uchar>(alpha* (m.at<Vec3b>(rows,cols)[1]) + beta); 
      m.at<Vec3b>(rows,c)[2] = saturate_cast<uchar>(alpha* (m.at<Vec3b>(rows,cols)[2]) + beta); 
     } 
    } 

    return m; 

} 

Это компилируется нормально, но когда я запускаю это, я получаю следующее сообщение об ошибке

OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)si 
ze.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channel 
s()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3 
) - 1))*4) & 15) == elemSize1()) in unknown function, file c:\opencv\build\inclu 
de\opencv2\core\mat.hpp, line 534 

Почему я получить это? Наверное, я все сделал правильно. Пожалуйста помоги.

+0

Привет, почему бы не использовать матричные арифметические операторы, как в этом вопросе: [http://stackoverflow.com/questions/16473695/is-there-a-quicker-way-to-apply-brightness-in- opencv/16477401 # 16477401] –

+2

changedimage = (2.2 * изображение) + cvScalar (50,50,50); – William

+0

@Willy, точно –

ответ

0

Попробуйте это ...

Mat Change(Mat input,int beta = 50) 
{ 
Mat Output; 

Scalar S(beta,beta,beta); 
cv::add(input,S,Output); 

return Output; 
} 
1

Попробуйте этот код.

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 

using namespace std; 
using namespace cv; 

Mat change(Mat m); 

int main() 
{ 
    Mat image = imread("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg"); 

    Mat changedImage = change(image); //Modified 

    namedWindow("Image"); 
    imshow("Image",changedImage); 

    waitKey(0); 
} 

Mat change(Mat m) 
{ 
    int cols = m.cols; 
    int rows = m.rows; 

    double alpha = 2.2; 
    int beta = 50; 

    for(int i=0;i<rows;i++) 
    { 
     for(int c=0;c<cols;c++) 
     { 
      m.at<Vec3b>(i,c)[0] = saturate_cast<uchar>(alpha* (m.at<Vec3b>(i,c))[0]) + beta); //Modified 
      m.at<Vec3b>(i,c)[1] = saturate_cast<uchar>(alpha* (m.at<Vec3b>(i,c))[1]) + beta); //Modified 
      m.at<Vec3b>(i,c)[2] = saturate_cast<uchar>(alpha* (m.at<Vec3b>(i,c))[2]) + beta); //Modified 
     } 
    } 

    return m; 

} 
Смежные вопросы