我是openCV和C ++的新手。我想更改我加载的图像的像素值,并在另一个窗口中显示该新图像以比较结果(只是在视觉上)。但是,当我运行代码时,我得到两个原始图像。这意味着我的for循环不会做它想做的事情(我怀疑它,因为它对我有意义)或者像素值丢失并且没有被保存以显示新图像。我读了一篇之前的帖子,说我应该在处理每个像素后设置更改后的图像。声明是:img.at(Point(x,y))= color。
有人可以告诉我我做错了什么吗?
谢谢
cv::Mat img = cv::imread("12.jpg", CV_LOAD_IMAGE_COLOR);
// start of pixel navigation
Mat navigateImage(Mat) {
for(int x = 0; x > img.rows; x++)
{
for(int y = 0; y > img.cols; y++){
Vec3b color = img.at<Vec3b>(Point(x,y));
if ( color[0] > 10 && color [1] > 10 && color[2]> 10 )
{
color[0] = 0 ;
color[1] = 0;
color[2] = 0;
img.at<Vec3b>(Point(x,y)) = color;
}
else
{
color.val[0] = 255 ;
color.val[1] = 255;
color.val[2] = 255;
img.at<Vec3b>(Point(x,y)) = color;
}
}
}
return img;
}
// end of pixel navigation
int main( int argc, char** argv )
{
if(! img.data){
cout << "could not open or find the image" << endl;
return -1;}
Mat newImage = navigateImage(img);
cv::imshow( " Original", img);
cv::imshow( " Altered ", newImage);
cv::waitKey(0);
return 0;
}
答案 0 :(得分:1)
<强>(1)即可。首先,
for(int x = 0; x > img.rows; x++)
和
for(int y = 0; y > img.cols; y++)
应该是
for(int x = 0; x < img.cols; x++)
和
for(int y = 0; y < img.rows; y++)
分别
因为这个错误你永远不会进入循环,两个图像是相同的。
<强>(2)即可。其次,
Mat navigateImage(Mat)
应该是
Mat navigateImage(Mat img)
<强>(3)即可。第三,提出
cv::Mat img = cv::imread("12.jpg", CV_LOAD_IMAGE_COLOR);
main
函数中的。
<强>(4)即可。最后, 替换,
Mat newImage = navigateImage();
通过
Mat newImage = navigateImage(img.clone());
否则,两张图片都是一样的。
更正后的代码 -
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
// start of pixel navigation
Mat navigateImage(Mat img) {
for(int x = 0; x < img.cols; x++)
{
for(int y = 0; y < img.rows; y++){
Vec3b color = img.at<Vec3b>(Point(x,y));
if ( color[0] > 10 && color [1] > 10 && color[2]> 10 )
{
color[0] = 0 ;
color[1] = 0;
color[2] = 0;
img.at<Vec3b>(Point(x,y)) = color;
}
else
{
color.val[0] = 255 ;
color.val[1] = 255;
color.val[2] = 255;
img.at<Vec3b>(Point(x,y)) = color;
}
}
}
return img;
}
// end of pixel navigation
int main( int argc, char** argv )
{
Mat img = cv::imread("12.png", CV_LOAD_IMAGE_COLOR);
if(! img.data){
cout << "could not open or find the image" << endl;
return -1;
}
Mat newImage = navigateImage(img.clone());
cv::imshow( " Original", img);
cv::imshow( " Altered ", newImage);
cv::waitKey(0);
return 0;
}