在 OpenCV 中设置像素值(奇怪的结果)
Setting pixel values in OpenCV (strange result)
我正在尝试这个简单的代码:
int main()
{
Mat a = Mat::zeros(Size(200,200) , CV_8UC1); Mat b;
b = a;
for(int i=0 ; i< a.rows ; i++)
{
for(int j = 0 ; j< a.cols ; j++)
{
a.at<int>(i,j) = 100;
}
}
namedWindow("one" , WINDOW_AUTOSIZE);
namedWindow("two" , WINDOW_AUTOSIZE);
imshow("one", a);
imshow("two", b);
waitKey();
return 0;
}
但是我得到了一些关于内存映射的奇怪结果。这段代码有什么问题?
这一行的问题。
a.at<int>(i,j) = 100;
您应该将其替换为:
a.at<uint8_t>(i,j) = 100;
或:
a.at<uchar>(i,j) = 100;
因为您将类型设置为 CV_8UC1
,所以您必须指定要访问的元素有 8 位。否则你会内存崩溃。
您需要注意如何声明您的 cv::Mat
Mat a = Mat::zeros(Size(200,200) , CV_8UC1);
CV_8UC1 类型的 cv::Mat 使用 8 位类型(unsigned char)。
a.at<int>(i,j) = 100;
此函数调用正在传递模板类型 int(带符号的 32 位整数)。您有类型冲突。
解决方案是:
a.at<uchar>(i,j) = 100;
我正在尝试这个简单的代码:
int main()
{
Mat a = Mat::zeros(Size(200,200) , CV_8UC1); Mat b;
b = a;
for(int i=0 ; i< a.rows ; i++)
{
for(int j = 0 ; j< a.cols ; j++)
{
a.at<int>(i,j) = 100;
}
}
namedWindow("one" , WINDOW_AUTOSIZE);
namedWindow("two" , WINDOW_AUTOSIZE);
imshow("one", a);
imshow("two", b);
waitKey();
return 0;
}
但是我得到了一些关于内存映射的奇怪结果。这段代码有什么问题?
这一行的问题。
a.at<int>(i,j) = 100;
您应该将其替换为:
a.at<uint8_t>(i,j) = 100;
或:
a.at<uchar>(i,j) = 100;
因为您将类型设置为 CV_8UC1
,所以您必须指定要访问的元素有 8 位。否则你会内存崩溃。
您需要注意如何声明您的 cv::Mat
Mat a = Mat::zeros(Size(200,200) , CV_8UC1);
CV_8UC1 类型的 cv::Mat 使用 8 位类型(unsigned char)。
a.at<int>(i,j) = 100;
此函数调用正在传递模板类型 int(带符号的 32 位整数)。您有类型冲突。
解决方案是:
a.at<uchar>(i,j) = 100;