Я в основном пробовал некоторые способы изменения пиксельных данных из уже существующих здесь вопросов. Однако ничего не работает.
Я работаю над iOS OpenCV2.framework.
Я реализовал следующий метод, но не изменяя outputImage.
UIImage *inputUIImage = [UIImage imageName:@"someImage.png"];
UIImage *outputUIImage = nil;
cv::Mat inputImage = <Getting this from a method that converts UIImage to cv::Mat: Working properly>
cv::Mat outputImage;
inputImage.copyTo(outputImage);
//processing...
for(int i=0; i < outputImage.rows; i++)
{
for (int j=0; j<outputImage.cols; j++)
{
Vec4b bgrColor = outputImage.at<Vec4b>(i,j);
//converting the 1st channel <assuming the sequence to be BGRA>
// to a very small value of blue i.e. 1 (out of 255)
bgrColor.val[0] = (uchar)1.0f;
}
}
outputUIImage = <Converting cv::Mat to UIImage via a local method : Working properly>
self.imageView1.image = inputUIImage;
self.imageView2.image = outputUIImage;
//here both images are same in colour. no changes.
Может ли кто-нибудь сообщить мне, что мне не хватает?
Проблема в том, что вы копируете ссылку, что outputImage.at<Vec4b>(i,j)
возвращает в локальную переменную bgrColor и модифицирует ее. Таким образом, ничего в outputImage не изменяется. То, что вы хотите сделать, - это напрямую изменить ссылку, возвращаемую Mat::at
.
Решения:
Vec4b& bgrColor = outputImage.at<Vec4b>(i,j);
bgrColor.val[0] = (uchar)1.0f;
или
outputImage.at<Vec4b>(i,j)[0] = (uchar)1.0f;